Adjusted window.go to make safe functions actually safe.

This commit is contained in:
Pietro Gagliardi 2014-06-28 15:40:06 -04:00
parent 7a1331c04c
commit cd116033a3
1 changed files with 38 additions and 26 deletions

View File

@ -89,37 +89,49 @@ func (w *Window) SetSpaced(spaced bool) {
// Open creates the Window with Create and then shows the Window with Show. As with Create, you cannot call Open more than once per window. // Open creates the Window with Create and then shows the Window with Show. As with Create, you cannot call Open more than once per window.
func (w *Window) Open(control Control) { func (w *Window) Open(control Control) {
w.Create(control) done := make(chan struct{})
w.Show() defer close(done)
touitask(func() {
w.Create(control)
w.Show()
done <- struct{}{}
})
<-done
} }
// Create creates the Window, setting its control to the given control. It does not show the window. This can only be called once per window, and finalizes all initialization of the control. // Create creates the Window, setting its control to the given control. It does not show the window. This can only be called once per window, and finalizes all initialization of the control.
func (w *Window) Create(control Control) { func (w *Window) Create(control Control) {
if w.created { done := make(chan struct{})
panic("window already open") defer close(done)
} touitask(func() {
w.sysData.spaced = w.spaced if w.created {
w.sysData.winhandler = w.handler panic("window already open")
w.sysData.close = func(b *bool) {
w.sysData.winhandler.Event(Closing, b)
}
err := w.sysData.make(nil)
if err != nil {
panic(fmt.Errorf("error opening window: %v", err))
}
if control != nil {
w.sysData.allocate = control.allocate
err = control.make(w.sysData)
if err != nil {
panic(fmt.Errorf("error adding window's control: %v", err))
} }
} w.sysData.spaced = w.spaced
err = w.sysData.setWindowSize(w.initWidth, w.initHeight) w.sysData.winhandler = w.handler
if err != nil { w.sysData.close = func(b *bool) {
panic(fmt.Errorf("error setting window size (in Window.Open()): %v", err)) w.sysData.winhandler.Event(Closing, b)
} }
w.sysData.setText(w.initTitle) err := w.sysData.make(nil)
w.created = true if err != nil {
panic(fmt.Errorf("error opening window: %v", err))
}
if control != nil {
w.sysData.allocate = control.allocate
err = control.make(w.sysData)
if err != nil {
panic(fmt.Errorf("error adding window's control: %v", err))
}
}
err = w.sysData.setWindowSize(w.initWidth, w.initHeight)
if err != nil {
panic(fmt.Errorf("error setting window size (in Window.Open()): %v", err))
}
w.sysData.setText(w.initTitle)
w.created = true
done <- struct{}{}
})
<-done
} }
// Show shows the window. // Show shows the window.