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 }