github.com/ckxng/wakeup@v0.0.0-20190105202853-90356a5f5a15/src/wakeup/window/window_windows.go (about) 1 // Copyright (c) 2015 Cameron King. All rights reserved. 2 // License: BSD 2-clause. 3 // Website: https://github.com/ckxng/wakeup 4 5 package window 6 7 import ( 8 "cef" 9 "syscall" 10 "unsafe" 11 "wingui" 12 "time" 13 "wakeup/config" 14 ) 15 16 func executeCEFSubprocess() { 17 logger.Println("GetModuleHandle") 18 hInstance, e := wingui.GetModuleHandle(nil) 19 if e != nil { wingui.AbortErrNo("GetModuleHandle", e) } 20 21 logger.Println("cef.ExecuteProcess") 22 cef.ExecuteProcess(unsafe.Pointer(hInstance)) 23 } 24 25 func createWindow(cfg *config.Config) { 26 wndproc := syscall.NewCallback(wndProc) 27 logger.Println("wingui.CreateWindow") 28 29 hwnd, _ := createWindowSize(cfg.Title, wndproc, cfg.WindowX, cfg.WindowY, cfg.WindowWidth, cfg.WindowHeight) 30 31 browserSettings := cef.BrowserSettings{} 32 url := cfg.URL() 33 logger.Printf("cef.CreateBrowser %s\n", url) 34 cef.CreateBrowser(unsafe.Pointer(hwnd), browserSettings, url) 35 36 // It should be enough to call WindowResized after 10ms, 37 // though to be sure let's extend it to 100ms. 38 time.AfterFunc(time.Millisecond * 100, func(){ 39 logger.Println("cef.WindowResized") 40 cef.WindowResized(unsafe.Pointer(hwnd)) 41 }) 42 } 43 44 func wndProc(hwnd syscall.Handle, msg uint32, wparam, lparam uintptr) (rc uintptr) { 45 switch msg { 46 case wingui.WM_CREATE: 47 rc = wingui.DefWindowProc(hwnd, msg, wparam, lparam) 48 case wingui.WM_SIZE: 49 cef.WindowResized(unsafe.Pointer(hwnd)) 50 case wingui.WM_CLOSE: 51 wingui.DestroyWindow(hwnd) 52 case wingui.WM_DESTROY: 53 cef.QuitMessageLoop() 54 default: 55 rc = wingui.DefWindowProc(hwnd, msg, wparam, lparam) 56 } 57 return 58 } 59 60 func createWindowSize(title string, wndproc uintptr, x int32, y int32, width int32, height int32) (hwnd syscall.Handle, err error) { 61 logger.Println("wingui.GetModuleHandle") 62 var mh syscall.Handle 63 if mh, err = wingui.GetModuleHandle(nil); err != nil { 64 return hwnd, err 65 } 66 67 logger.Println("wingui.LoadIcon IDI_APPLICATION") 68 var myicon syscall.Handle 69 if myicon, err = wingui.LoadIcon(0, wingui.IDI_APPLICATION); err != nil { 70 return hwnd, err 71 } 72 73 logger.Println("wingui.LoadCursor IDC_ARROW") 74 var mycursor syscall.Handle 75 if mycursor, err = wingui.LoadCursor(0, wingui.IDC_ARROW); err != nil { 76 return hwnd, err 77 } 78 79 logger.Println("wingui.RegisterClassEx myWindowClass") 80 wcname := syscall.StringToUTF16Ptr("myWindowClass") 81 wc := wingui.Wndclassex { 82 WndProc: wndproc, 83 Instance: mh, 84 Icon: myicon, 85 Cursor: mycursor, 86 Background: wingui.COLOR_BTNFACE + 1, 87 MenuName: nil, 88 ClassName: wcname, 89 IconSm: myicon, 90 } 91 wc.Size = uint32(unsafe.Sizeof(wc)) 92 if _, err = wingui.RegisterClassEx(&wc); err != nil { 93 return hwnd, err 94 } 95 96 logger.Println("wingui.CreateWindowEx") 97 if hwnd, err = wingui.CreateWindowEx( 98 0, 99 wcname, 100 syscall.StringToUTF16Ptr(title), 101 wingui.WS_OVERLAPPEDWINDOW, 102 x, y, width, height, 103 0, 0, mh, 0); err != nil { 104 return hwnd, err 105 } 106 107 logger.Println("wingui.ShowWindow") 108 wingui.ShowWindow(hwnd, wingui.SW_SHOWDEFAULT) 109 110 logger.Println("wingui.UpdateWindow") 111 if err = wingui.UpdateWindow(hwnd); err != nil { 112 return hwnd, err 113 } 114 115 return hwnd, nil 116 }