Changed the sysData cache so that if we didn't fill it in yet, getSysData() returns nil instead of panicking, and the standard window procedure jumps directly to the default handler. Not what I originally wanted to do, but whatever, it finally works!

This commit is contained in:
Pietro Gagliardi 2014-02-11 22:41:55 -05:00
parent 6da43e8bb7
commit 0f373195de
3 changed files with 19 additions and 15 deletions

View File

@ -16,7 +16,10 @@ var (
)
func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESULT {
// sysData := getSysData(hwnd)
sysData := getSysData(hwnd)
if sysData == nil { // not ready for events yet
goto defwndproc
}
switch uMsg {
case _WM_COMMAND:
id := wParam.LOWORD()
@ -32,19 +35,21 @@ func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESUL
// TODO
return 0
case _WM_CLOSE:
/* if sysData.closing != nil {
if sysData.closing != nil {
sysData.closing <- struct{}{}
}
*/ return 0
return 0
default:
r1, _, _ := defWindowProc.Call(
uintptr(hwnd),
uintptr(uMsg),
uintptr(wParam),
uintptr(lParam))
return _LRESULT(r1)
goto defwndproc
}
panic(fmt.Sprintf("stdWndProc message %d did not return: internal bug in ui library", uMsg))
defwndproc:
r1, _, _ := defWindowProc.Call(
uintptr(hwnd),
uintptr(uMsg),
uintptr(wParam),
uintptr(lParam))
return _LRESULT(r1)
}
type _WNDCLASS struct {

View File

@ -38,9 +38,6 @@ var classTypes = [nctypes]*classData{
}
func (s *sysData) make() (err error) {
sysDatasLock.Lock()
defer sysDatasLock.Unlock()
ret := make(chan uiret)
defer close(ret)
ct := classTypes[s.ctype]

View File

@ -18,16 +18,18 @@ var (
sysDatasLock sync.Mutex
)
// MUST HAVE LOCKED BEFORE CALLING
func addSysData(hwnd _HWND, s *sysData) {
sysDatasLock.Lock()
defer sysDatasLock.Unlock()
sysDatas[hwnd] = &sdcEntry{
s: s,
members: map[_HMENU]*sysData{},
}
}
// MUST HAVE LOCKED BEFORE CALLING
func addIDSysData(hwnd _HWND, id _HMENU, s *sysData) {
sysDatasLock.Lock()
defer sysDatasLock.Unlock()
if ss, ok := sysDatas[hwnd]; ok {
ss.members[id] = s
}
@ -40,7 +42,7 @@ func getSysData(hwnd _HWND) *sysData {
if ss, ok := sysDatas[hwnd]; ok {
return ss.s
}
panic(fmt.Sprintf("getting nonexistent HWND %d\n", hwnd))
return nil
}
func getIDSysData(hwnd _HWND, id _HMENU) *sysData {