github.com/shranet/mobile@v0.0.0-20200814083559-5702cdcd481b/app/shiny.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // +build windows
     6  
     7  package app
     8  
     9  import (
    10  	"log"
    11  
    12  	"golang.org/x/exp/shiny/driver/gldriver"
    13  	"golang.org/x/exp/shiny/screen"
    14  	"github.com/shranet/mobile/event/lifecycle"
    15  	"github.com/shranet/mobile/event/mouse"
    16  	"github.com/shranet/mobile/event/touch"
    17  	"github.com/shranet/mobile/gl"
    18  )
    19  
    20  func main(f func(a App)) {
    21  	gldriver.Main(func(s screen.Screen) {
    22  		w, err := s.NewWindow(nil)
    23  		if err != nil {
    24  			log.Fatal(err)
    25  		}
    26  		defer w.Release()
    27  
    28  		theApp.glctx = nil
    29  		theApp.worker = nil // handled by shiny
    30  
    31  		go func() {
    32  			for range theApp.publish {
    33  				res := w.Publish()
    34  				theApp.publishResult <- PublishResult{
    35  					BackBufferPreserved: res.BackBufferPreserved,
    36  				}
    37  			}
    38  		}()
    39  
    40  		go f(theApp)
    41  
    42  		for {
    43  			theApp.Send(convertEvent(w.NextEvent()))
    44  		}
    45  	})
    46  }
    47  
    48  func convertEvent(e interface{}) interface{} {
    49  	switch e := e.(type) {
    50  	case lifecycle.Event:
    51  		if theApp.glctx == nil {
    52  			theApp.glctx = e.DrawContext.(gl.Context)
    53  		}
    54  	case mouse.Event:
    55  		te := touch.Event{
    56  			X: e.X,
    57  			Y: e.Y,
    58  		}
    59  		switch e.Direction {
    60  		case mouse.DirNone:
    61  			te.Type = touch.TypeMove
    62  		case mouse.DirPress:
    63  			te.Type = touch.TypeBegin
    64  		case mouse.DirRelease:
    65  			te.Type = touch.TypeEnd
    66  		}
    67  		return te
    68  	}
    69  	return e
    70  }