summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-02-17 01:40:53 -0500
committerPietro Gagliardi <[email protected]>2014-02-17 01:40:53 -0500
commit0595135d9a259f7c54a361f0df6a6f7cb830a076 (patch)
treeb2ef9b7fdfd709269d12f618e8891ddd6f4ef72a
parent0856e953be71f13e4062c4e2ca44002ca4a68ac3 (diff)
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).
-rw-r--r--stdwndclass_windows.go11
-rw-r--r--sysdata_unix.go19
-rw-r--r--sysdata_windows.go26
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
}