github.com/as/shiny@v0.8.2/driver/win32/threadmain.go (about)

     1  // +build windows
     2  
     3  package win32
     4  
     5  import (
     6  	"fmt"
     7  	"runtime"
     8  )
     9  
    10  var mainCallback func()
    11  
    12  func Main(f func()) (retErr error) {
    13  	runtime.LockOSThread()
    14  
    15  	if err := initCommon(); err != nil {
    16  		return err
    17  	}
    18  
    19  	if err := initScreenWindow(); err != nil {
    20  		return err
    21  	}
    22  	defer DestroyWindow(screenHWND)
    23  
    24  	if err := initWindowClass(); err != nil {
    25  		return err
    26  	}
    27  
    28  	// Prime the pump.
    29  	mainCallback = f
    30  	PostMessage(screenHWND, msgMainCallback, 0, 0)
    31  
    32  	// Main message pump.
    33  	m := &Msg{}
    34  	for {
    35  		done, err := GetMessage(m, 0, 0, 0)
    36  		if err != nil {
    37  			return fmt.Errorf("win32 GetMessage failed: %v", err)
    38  		}
    39  		if done == 0 { // WM_QUIT
    40  			break
    41  		}
    42  		TranslateMessage(m)
    43  		DispatchMessage(m)
    44  	}
    45  
    46  	return nil
    47  }