Converted the standard Windows window class (for Window) to be a single class, rather than having a new one for each Window. Now for Area.

This commit is contained in:
Pietro Gagliardi 2014-05-30 21:49:55 -04:00
parent e5ec4bb159
commit a3e27bfbd0
3 changed files with 58 additions and 75 deletions

View File

@ -65,6 +65,10 @@ func doWindowsInit() (err error) {
if err != nil { if err != nil {
return fmt.Errorf("error initializing standard window class auxiliary info: %v", err) return fmt.Errorf("error initializing standard window class auxiliary info: %v", err)
} }
err = registerStdWndClass()
if err != nil {
return fmt.Errorf("error registering standard window class (for Window): %v", err)
}
err = getStandardWindowFonts() err = getStandardWindowFonts()
if err != nil { if err != nil {
return fmt.Errorf("error getting standard window fonts: %v", err) return fmt.Errorf("error getting standard window fonts: %v", err)

View File

@ -6,16 +6,10 @@ import (
"fmt" "fmt"
"syscall" "syscall"
"unsafe" "unsafe"
"sync"
) )
const ( const (
stdWndClassFormat = "gouiwnd%X" stdWndClass = "gouiwnd"
)
var (
curWndClassNum uintptr
curWndClassNumLock sync.Mutex
) )
var ( var (
@ -72,8 +66,7 @@ func storeSysData(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRES
return defWindowProc(hwnd, uMsg, wParam, lParam) return defWindowProc(hwnd, uMsg, wParam, lParam)
} }
func stdWndProc(unused *sysData) func(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESULT { func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESULT {
return func(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESULT {
s := getSysData(hwnd) s := getSysData(hwnd)
if s == nil { // not yet saved if s == nil { // not yet saved
return storeSysData(hwnd, uMsg, wParam, lParam) return storeSysData(hwnd, uMsg, wParam, lParam)
@ -120,7 +113,6 @@ func stdWndProc(unused *sysData) func(hwnd _HWND, uMsg uint32, wParam _WPARAM, l
} }
panic(fmt.Sprintf("stdWndProc message %d did not return: internal bug in ui library", uMsg)) panic(fmt.Sprintf("stdWndProc message %d did not return: internal bug in ui library", uMsg))
} }
}
type _WNDCLASS struct { type _WNDCLASS struct {
style uint32 style uint32
@ -143,33 +135,20 @@ var (
_registerClass = user32.NewProc("RegisterClassW") _registerClass = user32.NewProc("RegisterClassW")
) )
func registerStdWndClass(s *sysData) (newClassName string, err error) { func registerStdWndClass() (err error) {
curWndClassNumLock.Lock()
newClassName = fmt.Sprintf(stdWndClassFormat, curWndClassNum)
curWndClassNum++
curWndClassNumLock.Unlock()
wc := &_WNDCLASS{ wc := &_WNDCLASS{
lpszClassName: uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(newClassName))), lpszClassName: uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(stdWndClass))),
lpfnWndProc: syscall.NewCallback(stdWndProc(s)), lpfnWndProc: syscall.NewCallback(stdWndProc),
hInstance: hInstance, hInstance: hInstance,
hIcon: icon, hIcon: icon,
hCursor: cursor, hCursor: cursor,
hbrBackground: _HBRUSH(_COLOR_BTNFACE + 1), hbrBackground: _HBRUSH(_COLOR_BTNFACE + 1),
} }
r1, _, err := _registerClass.Call(uintptr(unsafe.Pointer(wc)))
ret := make(chan uiret) if r1 == 0 { // failure
defer close(ret) return err
uitask <- &uimsg{
call: _registerClass,
p: []uintptr{uintptr(unsafe.Pointer(wc))},
ret: ret,
} }
r := <-ret return nil
if r.ret == 0 { // failure
return "", r.err
}
return newClassName, nil
} }
// no need to use/recreate MAKEINTRESOURCE() here as the Windows constant generator already took care of that because Microsoft's headers do already // no need to use/recreate MAKEINTRESOURCE() here as the Windows constant generator already took care of that because Microsoft's headers do already

View File

@ -46,7 +46,7 @@ const controlxstyle = 0
var classTypes = [nctypes]*classData{ var classTypes = [nctypes]*classData{
c_window: &classData{ c_window: &classData{
register: registerStdWndClass, name: stdWndClass,
style: _WS_OVERLAPPEDWINDOW, style: _WS_OVERLAPPEDWINDOW,
xstyle: 0, xstyle: 0,
storeSysData: true, storeSysData: true,