Added control ID generation.
This commit is contained in:
parent
e9e2c0f269
commit
f93bebfeec
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"syscall"
|
"syscall"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type sysData struct {
|
type sysData struct {
|
||||||
|
@ -19,6 +20,7 @@ type classData struct {
|
||||||
name string
|
name string
|
||||||
style uint32
|
style uint32
|
||||||
xstyle uint32
|
xstyle uint32
|
||||||
|
mkid bool
|
||||||
}
|
}
|
||||||
|
|
||||||
//const controlstyle = _WS_CHILD | _WS_VISIBLE | _WS_TABSTOP
|
//const controlstyle = _WS_CHILD | _WS_VISIBLE | _WS_TABSTOP
|
||||||
|
@ -34,13 +36,29 @@ var classTypes = [nctypes]*classData{
|
||||||
// name: "BUTTON"
|
// name: "BUTTON"
|
||||||
// style: _BS_PUSHBUTTON | controlstyle,
|
// style: _BS_PUSHBUTTON | controlstyle,
|
||||||
// xstyle: 0 | controlxstyle,
|
// xstyle: 0 | controlxstyle,
|
||||||
|
// mkid: true,
|
||||||
// },
|
// },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
cid _HMENU = 0
|
||||||
|
cidLock sys.Mutex
|
||||||
|
)
|
||||||
|
|
||||||
|
func nextID() _HMENU {
|
||||||
|
cidLock.Lock()
|
||||||
|
defer cidLock.Unlock()
|
||||||
|
cid++
|
||||||
|
return cid
|
||||||
|
}
|
||||||
|
|
||||||
func (s *sysData) make() (err error) {
|
func (s *sysData) make() (err error) {
|
||||||
ret := make(chan uiret)
|
ret := make(chan uiret)
|
||||||
defer close(ret)
|
defer close(ret)
|
||||||
ct := classTypes[s.ctype]
|
ct := classTypes[s.ctype]
|
||||||
|
if ct.mkid {
|
||||||
|
s.cid = nextID()
|
||||||
|
}
|
||||||
uitask <- &uimsg{
|
uitask <- &uimsg{
|
||||||
call: _createWindowEx,
|
call: _createWindowEx,
|
||||||
p: []uintptr{
|
p: []uintptr{
|
||||||
|
@ -65,7 +83,9 @@ func (s *sysData) make() (err error) {
|
||||||
}
|
}
|
||||||
s.hwnd = _HWND(r.ret)
|
s.hwnd = _HWND(r.ret)
|
||||||
addSysData(s.hwnd, s)
|
addSysData(s.hwnd, s)
|
||||||
// TODO parent
|
if ct.mkid {
|
||||||
|
addSysDataID(s.cid, s)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,51 +8,39 @@ import (
|
||||||
|
|
||||||
// I need a way to get a sysData for a given HWND or a given HWND/control ID. So, this.
|
// I need a way to get a sysData for a given HWND or a given HWND/control ID. So, this.
|
||||||
|
|
||||||
type sdcEntry struct {
|
|
||||||
s *sysData
|
|
||||||
members map[_HMENU]*sysData
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
sysDatas = map[_HWND]*sdcEntry{}
|
sysDatas = map[_HWND]*sdcEntry{}
|
||||||
sysDatasLock sync.Mutex
|
sysDatasLock sync.Mutex
|
||||||
|
sysDataIDs = map[_HMENU]*sdcEntry{}
|
||||||
|
sysDataIDsLock sync.Mutex
|
||||||
)
|
)
|
||||||
|
|
||||||
func addSysData(hwnd _HWND, s *sysData) {
|
func addSysData(hwnd _HWND, s *sysData) {
|
||||||
sysDatasLock.Lock()
|
sysDatasLock.Lock()
|
||||||
defer sysDatasLock.Unlock()
|
defer sysDatasLock.Unlock()
|
||||||
sysDatas[hwnd] = &sdcEntry{
|
sysDatas[hwnd] = s
|
||||||
s: s,
|
|
||||||
members: map[_HMENU]*sysData{},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func addIDSysData(hwnd _HWND, id _HMENU, s *sysData) {
|
func addIDSysData(id _HMENU, s *sysData) {
|
||||||
sysDatasLock.Lock()
|
sysDataIDsLock.Lock()
|
||||||
defer sysDatasLock.Unlock()
|
defer sysDataIDsLock.Unlock()
|
||||||
if ss, ok := sysDatas[hwnd]; ok {
|
sysDataIDs[id] = s
|
||||||
ss.members[id] = s
|
|
||||||
}
|
|
||||||
panic(fmt.Sprintf("adding ID %d to nonexistent HWND %d\n", id, hwnd))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSysData(hwnd _HWND) *sysData {
|
func getSysData(hwnd _HWND) *sysData {
|
||||||
sysDatasLock.Lock()
|
sysDatasLock.Lock()
|
||||||
defer sysDatasLock.Unlock()
|
defer sysDatasLock.Unlock()
|
||||||
if ss, ok := sysDatas[hwnd]; ok {
|
if ss, ok := sysDatas[hwnd]; ok {
|
||||||
return ss.s
|
return ss
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getIDSysData(hwnd _HWND, id _HMENU) *sysData {
|
func getIDSysData(id _HMENU) *sysData {
|
||||||
sysDatasLock.Lock()
|
sysDataIDsLock.Lock()
|
||||||
defer sysDatasLock.Unlock()
|
defer sysDataIDsLock.Unlock()
|
||||||
if ss, ok := sysDatas[hwnd]; ok {
|
if ss, ok := sysDataIDs[id]; ok {
|
||||||
if xx, ok := ss.members[id]; ok {
|
return ss
|
||||||
return xx
|
|
||||||
}
|
}
|
||||||
panic(fmt.Sprintf("getting nonexistent ID %d for HWND %d\n", id, hwnd))
|
panic(fmt.Sprintf("getting nonexistent ID %d for HWND %d\n", id, hwnd))
|
||||||
}
|
|
||||||
panic(fmt.Sprintf("getting nonexistent HWND %d\n", hwnd))
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue