summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-02-12 10:35:15 -0500
committerPietro Gagliardi <[email protected]>2014-02-12 10:35:15 -0500
commitf93bebfeec42aeee07f43fcf6466b93f073b6111 (patch)
tree7b0028592c684f246e489c0852994cb124ab3914
parente9e2c0f269aac1157a3ea6a6021a86869fdd6888 (diff)
Added control ID generation.
-rw-r--r--sysdata_windows.go22
-rw-r--r--sysdatacache_windows.go40
2 files changed, 35 insertions, 27 deletions
diff --git a/sysdata_windows.go b/sysdata_windows.go
index 714f501..acc7070 100644
--- a/sysdata_windows.go
+++ b/sysdata_windows.go
@@ -5,6 +5,7 @@ import (
"fmt"
"syscall"
"unsafe"
+ "sync"
)
type sysData struct {
@@ -19,6 +20,7 @@ type classData struct {
name string
style uint32
xstyle uint32
+ mkid bool
}
//const controlstyle = _WS_CHILD | _WS_VISIBLE | _WS_TABSTOP
@@ -34,13 +36,29 @@ var classTypes = [nctypes]*classData{
// name: "BUTTON"
// style: _BS_PUSHBUTTON | controlstyle,
// 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) {
ret := make(chan uiret)
defer close(ret)
ct := classTypes[s.ctype]
+ if ct.mkid {
+ s.cid = nextID()
+ }
uitask <- &uimsg{
call: _createWindowEx,
p: []uintptr{
@@ -65,7 +83,9 @@ func (s *sysData) make() (err error) {
}
s.hwnd = _HWND(r.ret)
addSysData(s.hwnd, s)
- // TODO parent
+ if ct.mkid {
+ addSysDataID(s.cid, s)
+ }
return nil
}
diff --git a/sysdatacache_windows.go b/sysdatacache_windows.go
index 620d6ac..16848e2 100644
--- a/sysdatacache_windows.go
+++ b/sysdatacache_windows.go
@@ -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.
-type sdcEntry struct {
- s *sysData
- members map[_HMENU]*sysData
-}
-
var (
sysDatas = map[_HWND]*sdcEntry{}
sysDatasLock sync.Mutex
+ sysDataIDs = map[_HMENU]*sdcEntry{}
+ sysDataIDsLock sync.Mutex
)
func addSysData(hwnd _HWND, s *sysData) {
sysDatasLock.Lock()
defer sysDatasLock.Unlock()
- sysDatas[hwnd] = &sdcEntry{
- s: s,
- members: map[_HMENU]*sysData{},
- }
+ sysDatas[hwnd] = s
}
-func addIDSysData(hwnd _HWND, id _HMENU, s *sysData) {
- sysDatasLock.Lock()
- defer sysDatasLock.Unlock()
- if ss, ok := sysDatas[hwnd]; ok {
- ss.members[id] = s
- }
- panic(fmt.Sprintf("adding ID %d to nonexistent HWND %d\n", id, hwnd))
+func addIDSysData(id _HMENU, s *sysData) {
+ sysDataIDsLock.Lock()
+ defer sysDataIDsLock.Unlock()
+ sysDataIDs[id] = s
}
func getSysData(hwnd _HWND) *sysData {
sysDatasLock.Lock()
defer sysDatasLock.Unlock()
if ss, ok := sysDatas[hwnd]; ok {
- return ss.s
+ return ss
}
return nil
}
-func getIDSysData(hwnd _HWND, id _HMENU) *sysData {
- sysDatasLock.Lock()
- defer sysDatasLock.Unlock()
- if ss, ok := sysDatas[hwnd]; ok {
- if xx, ok := ss.members[id]; ok {
- return xx
- }
- panic(fmt.Sprintf("getting nonexistent ID %d for HWND %d\n", id, hwnd))
+func getIDSysData(id _HMENU) *sysData {
+ sysDataIDsLock.Lock()
+ defer sysDataIDsLock.Unlock()
+ if ss, ok := sysDataIDs[id]; ok {
+ return ss
}
- panic(fmt.Sprintf("getting nonexistent HWND %d\n", hwnd))
+ panic(fmt.Sprintf("getting nonexistent ID %d for HWND %d\n", id, hwnd))
}