github.com/as/shiny@v0.8.2/driver/win32/gdi.go (about) 1 2 // +build windows 3 4 5 package win32 6 7 import ( 8 "sync" 9 "syscall" 10 ) 11 12 const windowClass = "shiny_Window" 13 const ( 14 CS_OWNDC = 32 15 ) 16 17 const ( 18 msgCreateWindow = WmUser + iota 19 msgMainCallback 20 msgShow 21 msgQuit 22 msgLast 23 ) 24 25 var ( 26 hDefaultIcon syscall.Handle 27 hDefaultCursor syscall.Handle 28 hThisInstance syscall.Handle 29 ) 30 31 var currentUserWM userWM 32 33 func initCommon() (err error) { 34 hDefaultIcon, err = LoadIcon(0, IdiApplication) 35 if err != nil { 36 return err 37 } 38 hDefaultCursor, err = LoadCursor(0, IdcArrow) 39 if err != nil { 40 return err 41 } 42 // TODO(andlabs) hThisInstance 43 return nil 44 } 45 46 func initWindowClass() (err error) { 47 wcname, err := syscall.UTF16PtrFromString(windowClass) 48 if err != nil { 49 return err 50 } 51 _, err = RegisterClass(&WindowClass{ 52 Style: CS_OWNDC, 53 LpszClassName: wcname, 54 LpfnWndProc: syscall.NewCallback(windowWndProc), 55 HIcon: hDefaultIcon, 56 HCursor: hDefaultCursor, 57 HInstance: hThisInstance, 58 HbrBackground: syscall.Handle(ColorBtnface + 1), 59 }) 60 return err 61 } 62 63 // userWM is used to generate private (WM_USER and above) window message IDs 64 // for use by screenWindowWndProc and windowWndProc. 65 type userWM struct { 66 sync.Mutex 67 id uint32 68 } 69 70 func (m *userWM) next() uint32 { 71 m.Lock() 72 if m.id == 0 { 73 m.id = msgLast 74 } 75 r := m.id 76 m.id++ 77 m.Unlock() 78 return r 79 }