summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-02-11 18:22:39 -0500
committerPietro Gagliardi <[email protected]>2014-02-11 18:22:39 -0500
commitb918496ae453d5e4e703f02d4a70474b9a84d67a (patch)
tree9849c9dd9995b0c001e53fdd4e8ee032747c1de3
parentc6a8a4d2f799756fa83a9e556d363decd896e8f2 (diff)
Filled in the standard window procedure.
-rw-r--r--stdwndclass_windows.go21
-rw-r--r--sysdata.go3
-rw-r--r--sysdatacache_windows.go58
-rw-r--r--window.go2
4 files changed, 83 insertions, 1 deletions
diff --git a/stdwndclass_windows.go b/stdwndclass_windows.go
index e6796e5..730cd51 100644
--- a/stdwndclass_windows.go
+++ b/stdwndclass_windows.go
@@ -5,6 +5,7 @@ import (
"fmt"
"syscall"
"unsafe"
+ "sync"
)
const (
@@ -16,8 +17,26 @@ var (
)
func stdWndProc(hwnd _HWND, uMsg uint32, wParam _WPARAM, lParam _LPARAM) _LRESULT {
- // TODO get CreateWindowEx data
+ sysData := getSysData(hwnd)
switch uMsg {
+ case _WM_COMMAND:
+ id := wParam.LOWORD()
+ // ... member events
+ _ = id
+ return 0
+ case _WM_GETMINMAXINFO:
+ mm := lParam.MINMAXINFO()
+ // ... minimum size
+ _ = mm
+ return 0
+ case _WM_SIZE:
+ // TODO
+ return 0
+ case _WM_CLOSE:
+ if sysData.closing != nil {
+ sysData.closing <- struct{}
+ }
+ return 0
default:
r1, _, _ := defWindowProc.Call(
uintptr(hwnd),
diff --git a/sysdata.go b/sysdata.go
index eb4d8ea..298c1ef 100644
--- a/sysdata.go
+++ b/sysdata.go
@@ -9,6 +9,9 @@ import (
type cSysData struct {
ctype int
text string
+
+ // for Window
+ closing chan struct{}
}
func (c *cSysData) make() error {
panic(runtime.GOOS + " sysData does not define make()")
diff --git a/sysdatacache_windows.go b/sysdatacache_windows.go
new file mode 100644
index 0000000..1a45d97
--- /dev/null
+++ b/sysdatacache_windows.go
@@ -0,0 +1,58 @@
+// 11 february 2014
+package main
+
+import (
+ "fmt"
+ "sync"
+)
+
+// 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 sys.Mutex
+)
+
+func addSysData(hwnd _HWND, s *sysData) {
+ sysDatasLock.Lock()
+ defer sysDatasLock.Unlock()
+ sysDatas[hwnd] = &sdcEntry{
+ s: s,
+ members: map[_HMENU]*sysData{},
+ }
+}
+
+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 getSysData(hwnd _HWND) *sysData {
+ sysDatasLock.Lock()
+ defer sysDatasLock.Unlock()
+ if ss, ok := sysDatas[hwnd]; ok {
+ return ss.s
+ }
+ panic(fmt.Sprintf("getting nonexistent HWND %d\n", hwnd))
+}
+
+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))
+ }
+ panic(fmt.Sprintf("getting nonexistent HWND %d\n", hwnd))
+}
diff --git a/window.go b/window.go
index 45ae9f3..c04d276 100644
--- a/window.go
+++ b/window.go
@@ -57,6 +57,7 @@ func (w *Window) Open() (err error) {
// If the window has already been created, show it.
if !w.created {
+ w.sysData.closing = w.Closing
err = w.sysData.make()
if err != nil {
return err
@@ -72,6 +73,7 @@ func (w *Window) Open() (err error) {
}
// Close closes the window. The window is not destroyed; it is merely hidden.
+// TODO don't send on w.Closing
func (w *Window) Close() (err error) {
return w.sysData.hide()
}