I don't have any particular insights explaining it, but I just tried
adding a print after at the end of my shiny-based text editor and (at
least on OS X), indeed, it never gets executed. It appears to be a bug
(at the very least, a documentation bug since it explicitly says it
returns.)


On Thu, Sep 7, 2017 at 3:08 PM,  <hani...@gmail.com> wrote:
> 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> 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.
>> > 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.



-- 
- 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.

Reply via email to