summaryrefslogtreecommitdiff
path: root/init_windows.go
diff options
context:
space:
mode:
authorPietro Gagliardi <[email protected]>2014-02-11 16:25:27 -0500
committerPietro Gagliardi <[email protected]>2014-02-11 16:25:27 -0500
commitb727a972adbc90c3cdfbff2c462a583aefd48474 (patch)
treed85cb4bcddf511f449589e4b4614e8dab985e2b1 /init_windows.go
parentaf22eea889d553c6ed05b4bbaec4fe37fd85f2ff (diff)
Set up initialization on Windows (2/2).
Diffstat (limited to 'init_windows.go')
-rw-r--r--init_windows.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/init_windows.go b/init_windows.go
new file mode 100644
index 0000000..bea6516
--- /dev/null
+++ b/init_windows.go
@@ -0,0 +1,77 @@
+// 8 february 2014
+package main
+
+import (
+ "fmt"
+// "syscall"
+ "unsafe"
+)
+
+const (
+ windowclass = "gouiwndclass"
+)
+
+var (
+ hInstance HANDLE
+ nCmdShow int
+ // TODO font
+ // TODO common window class
+)
+
+// TODO is this trick documented in MSDN?
+func getWinMainhInstance() (err error) {
+ r1, _, err := kernel32.NewProc("GetModuleHandleW").Call(uintptr(NULL))
+ if r1 == 0 { // failure
+ return err
+ }
+ hInstance = HANDLE(r1)
+ return nil
+}
+
+// TODO this is what MinGW-w64's crt (svn revision xxx) does; is it best? is any of this documented anywhere on MSDN?
+// TODO I highly doubt Windows API functions ever not fail, so figure out what to do should an error actually occur
+func getWinMainnCmdShow() (nCmdShow int, err error) {
+ var info struct {
+ cb uint32
+ lpReserved *uint16
+ lpDesktop *uint16
+ lpTitle *uint16
+ dwX uint32
+ dwY uint32
+ dwXSize uint32
+ dwYSzie uint32
+ dwXCountChars uint32
+ dwYCountChars uint32
+ dwFillAttribute uint32
+ dwFlags uint32
+ wShowWindow uint16
+ cbReserved2 uint16
+ lpReserved2 *byte
+ hStdInput HANDLE
+ hStdOutput HANDLE
+ hStdError HANDLE
+ }
+ const _STARTF_USESHOWWINDOW = 0x00000001
+
+ // does not fail according to MSDN
+ kernel32.NewProc("GetStartupInfoW").Call(uintptr(unsafe.Pointer(&info)))
+ if info.dwFlags & _STARTF_USESHOWWINDOW != 0 {
+ nCmdShow = int(info.wShowWindow)
+ return nil
+ }
+ nCmdShow = _SW_SHOWDEFAULT
+ return nil
+}
+
+func doWindowsInit() (err error) {
+ err = getWinMainhInstance()
+ if err != nil {
+ return fmt.Errorf("error getting WinMain hInstance: %v", err)
+ }
+ err = getWinMainnCmdShow()
+ if err != nil {
+ return fmt.Errorf("error getting WinMain nCmdShow: %v", err)
+ }
+ // TODO others
+ return nil // all ready to go
+}