summaryrefslogtreecommitdiff
path: root/newctrl/window_windows.go
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-10-14 15:17:35 -0400
committerPietro Gagliardi <[email protected]>2014-10-14 15:17:35 -0400
commiteef3e1136b51112c23620b150ffcf03caddc0ff9 (patch)
treea80096f1c580d23975032dd38aa7fd86700fb4ac /newctrl/window_windows.go
parentaad6e4c699614d9911df16d0b3bf86b10db5087c (diff)
Started the new recontainerization..
Diffstat (limited to 'newctrl/window_windows.go')
-rw-r--r--newctrl/window_windows.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/newctrl/window_windows.go b/newctrl/window_windows.go
new file mode 100644
index 0000000..4dc5454
--- /dev/null
+++ b/newctrl/window_windows.go
@@ -0,0 +1,101 @@
+// 12 july 2014
+
+package ui
+
+import (
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+// #include "winapi_windows.h"
+import "C"
+
+type window struct {
+ hwnd C.HWND
+ shownbefore bool
+
+ closing *event
+
+ child Control
+}
+
+func makeWindowWindowClass() error {
+ var errmsg *C.char
+
+ err := C.makeWindowWindowClass(&errmsg)
+ if err != 0 || errmsg != nil {
+ return fmt.Errorf("%s: %v", C.GoString(errmsg), syscall.Errno(err))
+ }
+ return nil
+}
+
+func newWindow(title string, width int, height int, control Control) *window {
+ w := &window{
+ // hwnd set in WM_CREATE handler
+ closing: newEvent(),
+ child: control,
+ }
+ hwnd := C.newWindow(toUTF16(title), C.int(width), C.int(height), unsafe.Pointer(w))
+ if hwnd != w.hwnd {
+ panic(fmt.Errorf("inconsistency: hwnd returned by CreateWindowEx() (%p) and hwnd stored in Window (%p) differ", hwnd, w.hwnd))
+ }
+ hresult := C.EnableThemeDialogTexture(w.hwnd, C.ETDT_ENABLE|C.ETDT_USETABTEXTURE)
+ if hresult != C.S_OK {
+ panic(fmt.Errorf("error setting tab background texture on Window; HRESULT: 0x%X", hresult))
+ }
+ w.child.setParent(&controlParent{w.hwnd})
+ return w
+}
+
+func (w *window) Title() string {
+ return getWindowText(w.hwnd)
+}
+
+func (w *window) SetTitle(title string) {
+ C.setWindowText(w.hwnd, toUTF16(title))
+}
+
+func (w *window) Show() {
+ if !w.shownbefore {
+ C.ShowWindow(w.hwnd, C.nCmdShow)
+ C.updateWindow(w.hwnd)
+ w.shownbefore = true
+ } else {
+ C.ShowWindow(w.hwnd, C.SW_SHOW)
+ }
+}
+
+func (w *window) Hide() {
+ C.ShowWindow(w.hwnd, C.SW_HIDE)
+}
+
+func (w *window) Close() {
+ C.windowClose(w.hwnd)
+}
+
+func (w *window) OnClosing(e func() bool) {
+ w.closing.setbool(e)
+}
+
+//export storeWindowHWND
+func storeWindowHWND(data unsafe.Pointer, hwnd C.HWND) {
+ w := (*window)(data)
+ w.hwnd = hwnd
+}
+
+//export windowResize
+func windowResize(data unsafe.Pointer, r *C.RECT) {
+ w := (*window)(data)
+ TODO := &sizing{}
+ w.child.resize(int(r.left), int (r.top), int(r.right - r.left), int(r.bottom - r.top), TODO)
+}
+
+//export windowClosing
+func windowClosing(data unsafe.Pointer) {
+ w := (*window)(data)
+ close := w.closing.fire()
+ if close {
+ C.windowClose(w.hwnd)
+ }
+}