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:
parent
6da43e8bb7
commit
0f373195de
|
@ -16,7 +16,10 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESULT {
|
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 {
|
switch uMsg {
|
||||||
case _WM_COMMAND:
|
case _WM_COMMAND:
|
||||||
id := wParam.LOWORD()
|
id := wParam.LOWORD()
|
||||||
|
@ -32,19 +35,21 @@ func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESUL
|
||||||
// TODO
|
// TODO
|
||||||
return 0
|
return 0
|
||||||
case _WM_CLOSE:
|
case _WM_CLOSE:
|
||||||
/* if sysData.closing != nil {
|
if sysData.closing != nil {
|
||||||
sysData.closing <- struct{}{}
|
sysData.closing <- struct{}{}
|
||||||
}
|
}
|
||||||
*/ return 0
|
return 0
|
||||||
default:
|
default:
|
||||||
r1, _, _ := defWindowProc.Call(
|
goto defwndproc
|
||||||
uintptr(hwnd),
|
|
||||||
uintptr(uMsg),
|
|
||||||
uintptr(wParam),
|
|
||||||
uintptr(lParam))
|
|
||||||
return _LRESULT(r1)
|
|
||||||
}
|
}
|
||||||
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))
|
||||||
|
defwndproc:
|
||||||
|
r1, _, _ := defWindowProc.Call(
|
||||||
|
uintptr(hwnd),
|
||||||
|
uintptr(uMsg),
|
||||||
|
uintptr(wParam),
|
||||||
|
uintptr(lParam))
|
||||||
|
return _LRESULT(r1)
|
||||||
}
|
}
|
||||||
|
|
||||||
type _WNDCLASS struct {
|
type _WNDCLASS struct {
|
||||||
|
|
|
@ -38,9 +38,6 @@ var classTypes = [nctypes]*classData{
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *sysData) make() (err error) {
|
func (s *sysData) make() (err error) {
|
||||||
sysDatasLock.Lock()
|
|
||||||
defer sysDatasLock.Unlock()
|
|
||||||
|
|
||||||
ret := make(chan uiret)
|
ret := make(chan uiret)
|
||||||
defer close(ret)
|
defer close(ret)
|
||||||
ct := classTypes[s.ctype]
|
ct := classTypes[s.ctype]
|
||||||
|
|
|
@ -18,16 +18,18 @@ var (
|
||||||
sysDatasLock sync.Mutex
|
sysDatasLock sync.Mutex
|
||||||
)
|
)
|
||||||
|
|
||||||
// MUST HAVE LOCKED BEFORE CALLING
|
|
||||||
func addSysData(hwnd _HWND, s *sysData) {
|
func addSysData(hwnd _HWND, s *sysData) {
|
||||||
|
sysDatasLock.Lock()
|
||||||
|
defer sysDatasLock.Unlock()
|
||||||
sysDatas[hwnd] = &sdcEntry{
|
sysDatas[hwnd] = &sdcEntry{
|
||||||
s: s,
|
s: s,
|
||||||
members: map[_HMENU]*sysData{},
|
members: map[_HMENU]*sysData{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MUST HAVE LOCKED BEFORE CALLING
|
|
||||||
func addIDSysData(hwnd _HWND, id _HMENU, s *sysData) {
|
func addIDSysData(hwnd _HWND, id _HMENU, s *sysData) {
|
||||||
|
sysDatasLock.Lock()
|
||||||
|
defer sysDatasLock.Unlock()
|
||||||
if ss, ok := sysDatas[hwnd]; ok {
|
if ss, ok := sysDatas[hwnd]; ok {
|
||||||
ss.members[id] = s
|
ss.members[id] = s
|
||||||
}
|
}
|
||||||
|
@ -40,7 +42,7 @@ func getSysData(hwnd _HWND) *sysData {
|
||||||
if ss, ok := sysDatas[hwnd]; ok {
|
if ss, ok := sysDatas[hwnd]; ok {
|
||||||
return ss.s
|
return ss.s
|
||||||
}
|
}
|
||||||
panic(fmt.Sprintf("getting nonexistent HWND %d\n", hwnd))
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getIDSysData(hwnd _HWND, id _HMENU) *sysData {
|
func getIDSysData(hwnd _HWND, id _HMENU) *sysData {
|
||||||
|
|
Loading…
Reference in New Issue