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  }