From 0595135d9a259f7c54a361f0df6a6f7cb830a076 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Mon, 17 Feb 2014 01:40:53 -0500 Subject: [PATCH] Fixed the GTK+ crashes (I think) by making resizes synchronous. Since all control resizes happen on the UI thread anyway, we don't need to dispatch back; just call the resizing functions directly. Windows gets this fix too for consistency (and also because it gets rid of the only asynchronous oddity in the system). --- stdwndclass_windows.go | 11 ++++------- sysdata_unix.go | 19 +++++++------------ sysdata_windows.go | 26 +++++++++----------------- 3 files changed, 20 insertions(+), 36 deletions(-) diff --git a/stdwndclass_windows.go b/stdwndclass_windows.go index 276fdc6..2824746 100644 --- a/stdwndclass_windows.go +++ b/stdwndclass_windows.go @@ -51,13 +51,10 @@ func stdWndProc(s *sysData) func(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam if r1 == 0 { panic("GetClientRect failed: " + err.Error()) } - // run the resize in a goroutine, since the WndProc is being run on uitask - go func() { - err = s.resize(int(r.Left), int(r.Top), int(r.Right), int(r.Bottom)) - if err != nil { - panic("child resize failed: " + err.Error()) - } - }() + err = s.resize(int(r.Left), int(r.Top), int(r.Right), int(r.Bottom)) + if err != nil { + panic("child resize failed: " + err.Error()) + } } return 0 case _WM_CLOSE: diff --git a/sysdata_unix.go b/sysdata_unix.go index d2e6d16..50ca75d 100644 --- a/sysdata_unix.go +++ b/sysdata_unix.go @@ -48,12 +48,13 @@ var classTypes = [nctypes]*classData{ return func() bool { if w.container != nil && w.resize != nil { // wait for init width, height := gtk_window_get_size(w.widget) - // run in another goroutine since this will be called in uitask - go func() { - w.resize(0, 0, width, height) - }() + err := w.resize(0, 0, width, height) + if err != nil { + panic("child resize failed: " + err.Error()) + } } // returning false indicates that we continue processing events related to configure-event; if we choose not to, then after some controls have been added, the layout fails completely and everything stays in the starting position/size + // TODO make sure this is the case return false } }, @@ -198,14 +199,8 @@ func (s *sysData) setText(text string) error { } func (s *sysData) setRect(x int, y int, width int, height int) error { - ret := make(chan struct{}) - defer close(ret) - uitask <- func() { - gtk_fixed_move(s.container, s.widget, x, y) - gtk_widget_set_size_request(s.widget, width, height) - ret <- struct{}{} - } - <-ret + gtk_fixed_move(s.container, s.widget, x, y) + gtk_widget_set_size_request(s.widget, width, height) return nil } diff --git a/sysdata_windows.go b/sysdata_windows.go index 7a5abae..326db06 100644 --- a/sysdata_windows.go +++ b/sysdata_windows.go @@ -226,23 +226,15 @@ func (s *sysData) setText(text string) error { } func (s *sysData) setRect(x int, y int, width int, height int) error { - ret := make(chan uiret) - defer close(ret) - uitask <- &uimsg{ - call: _moveWindow, - p: []uintptr{ - uintptr(s.hwnd), - uintptr(x), - uintptr(y), - uintptr(width), - uintptr(height), - uintptr(_TRUE), - }, - ret: ret, - } - r := <-ret - if r.ret == 0 { // failure - return fmt.Errorf("error setting window/control rect: %v", r.err) + r1, _, err := _moveWindow.Call( + uintptr(s.hwnd), + uintptr(x), + uintptr(y), + uintptr(width), + uintptr(height), + uintptr(_TRUE)) + if r1 == 0 { // failure + return fmt.Errorf("error setting window/control rect: %v", err) } return nil }