Hi Dave, Thanks for the reply.
My example above was stripped down for illustration purposes, not to make a useful graphical program. I get the same result when creating a window. I've read through most of the examples, and have based my code on them, which works quite well. I paint a billiard table on the main window and update ball positions via multicast messages, which are being read in another goroutine, which in turn sends ball positions on a channel, and a third goroutine receives from the channel and sends paint events (as well as custom events I create) to the window's EventDeque. All this works well, but I want to clean up properly (e.g., leave the multicast group, release resources, etc.) if the program quits via the GUI. I can put this all in a deferred function to the one passed to driver.Main, but at first I had it after the call to driver.Main. I was wondering why this doesn't work. I'll add the the simple, stripped down, example above to make things clear. Here I create a window and then return, which panics. I played around with this a while ago and figured that it has something to do with the lifecycle events. (I also noticed that it panics if I call Send on the EventDeque too early, possibly before certain lifecycle events are placed on it?) I'd like to understand better why it panics too! So if I run this: package main import ( "fmt" "log" "golang.org/x/exp/shiny/driver" "golang.org/x/exp/shiny/screen" ) func main() { fmt.Println("Starting.") driver.Main(func(s screen.Screen) { fmt.Println("I'm printed; you can see me.") w, err := s.NewWindow(&screen.NewWindowOptions{Title: "I Don't Return"}) if err != nil { log.Fatal(err) } defer w.Release() fmt.Println("You can see me too.") return }) fmt.Println("I'm not printed; alas, I can't be seen.") } I get this: william@hardy% go run main.go Starting. I'm printed; you can see me. You can see me too. panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x40bac17] goroutine 1 [running, locked to thread]: golang.org/x/exp/shiny/driver/gldriver.preparedOpenGL(0x4367a20, 0x451eb10, 0x1) /Users/william/src/golang.org/x/exp/shiny/driver/gldriver/cocoa.go:91 +0xb7 golang.org/x/exp/shiny/driver/gldriver._cgoexpwrap_78313b9f6607_preparedOpenGL(0x4367a20, 0x451eb10, 0x1) golang.org/x/exp/shiny/driver/gldriver/_obj/_cgo_gotypes.go:345 +0x3f golang.org/x/exp/shiny/driver/gldriver._Cfunc_startDriver() golang.org/x/exp/shiny/driver/gldriver/_obj/_cgo_gotypes.go:305 +0x41 golang.org/x/exp/shiny/driver/gldriver.main(0x4108550, 0x0, 0xc420053f10) /Users/william/src/golang.org/x/exp/shiny/driver/gldriver/cocoa.go:107 +0x51 golang.org/x/exp/shiny/driver/gldriver.Main(0x4108550) /Users/william/src/golang.org/x/exp/shiny/driver/gldriver/gldriver.go:26 +0x2f golang.org/x/exp/shiny/driver.main(0x4108550) /Users/william/src/golang.org/x/exp/shiny/driver/driver_darwin.go:15 +0x2b golang.org/x/exp/shiny/driver.Main(0x4108550) /Users/william/src/golang.org/x/exp/shiny/driver/driver.go:24 +0x2b main.main() /Users/william/src/play/shiny/main.go:13 +0x7b exit status 2 william@hardy% But if I add code to process events, it doesn't panic. Adding such code and running this: package main import ( "fmt" "image" "log" "golang.org/x/exp/shiny/driver" "golang.org/x/exp/shiny/screen" "golang.org/x/mobile/event/key" "golang.org/x/mobile/event/lifecycle" "golang.org/x/mobile/event/paint" "golang.org/x/mobile/event/size" ) func main() { fmt.Println("Starting.") driver.Main(func(s screen.Screen) { fmt.Println("I'm printed; you can see me.") w, err := s.NewWindow(&screen.NewWindowOptions{Title: "I Don't Return"}) if err != nil { log.Fatal(err) } defer w.Release() var b screen.Buffer defer func() { if b != nil { b.Release() } }() fmt.Println("You can see me too.") for { switch e := w.NextEvent().(type) { case lifecycle.Event: if e.To == lifecycle.StageDead { return } case key.Event: if e.Direction == key.DirPress && e.Modifiers == key.ModMeta { switch e.Code { case key.CodeQ: return } } case paint.Event: w.Upload(image.Point{}, b, b.Bounds()) w.Publish() case size.Event: if b != nil { b.Release() } b, err = s.NewBuffer(e.Size()) if err != nil { log.Fatal(err) } case error: log.Print(e) } } }) fmt.Println("I'm not printed; alas, I can't be seen.") } and either choose the Quit menu option on the top menu bar or hit Command-Q, I get this: william@hardy% go run main.go Starting. I'm printed; you can see me. You can see me too. william@hardy% Notice that "I'm not printed; alas, I can't be seen." is not printed to stdout, implying that driver.Main is not returning normally. Can you point me somewhere to understand this better? Thanks again for your help! William On Thursday, September 7, 2017 at 2:07:20 PM UTC-4, Dave MacFarlane wrote: > > What are you trying to do? I don't see the point in a shiny program > that doesn't even create a window. There's likely a loop internally in > the driver that's handling processing of events from the OS and since > you're never creating a window, it's never exiting (this is just a > guess, I haven't looked at the code lately.) > > Have you looked at the samples in > https://github.com/golang/exp/tree/master/shiny/example? They're > likely a better place to start. > > > On Thu, Sep 7, 2017 at 12:32 PM, <han...@gmail.com <javascript:>> wrote: > > I'm using shiny for a small internal project and noticed that > driver.Main > > doesn't seem to return. > > > > The documentation for: > > > > func Main(f func(screen.Screen)) > > > > in golang.org/x/exp/shiny/driver sates that "It returns when f > returns." > > > > But when I run this: > > > > package main > > > > import ( > > "fmt" > > > > "golang.org/x/exp/shiny/driver" > > "golang.org/x/exp/shiny/screen" > > ) > > > > func main() { > > fmt.Println("Starting.") > > driver.Main(func(s screen.Screen) { > > fmt.Println("I'm printed; you can see me.") > > return > > }) > > fmt.Println("I'm not printed; alas, I can't be seen.") > > } > > > > on a MacBook Pro running macOS Sierra Version 10.12.6 and go1.9 > darwin/amd64 > > that last print statement is not called. It's as though os.Exit, or an > > equivalent, is being called somewhere within driver.Main and below, > though I > > can't seem to find any such call in the source. > > > > I've tried to do a web search for this but didn't get any useful links > > either. I understand that shiny is experimental and that development > has > > paused recently, but I'm just trying to understand what's going on. > > > > Any help is very much appreciated! > > > > William > > > > -- > > You received this message because you are subscribed to the Google > Groups > > "golang-nuts" group. > > To unsubscribe from this group and stop receiving emails from it, send > an > > email to golang-nuts...@googlegroups.com <javascript:>. > > For more options, visit https://groups.google.com/d/optout. > > > > -- > - Dave > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.