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  }