func (wb *WindowBase) setTheme(appName string) error { if hr := win.SetWindowTheme(wb.hWnd, syscall.StringToUTF16Ptr(appName), nil); win.FAILED(hr) { return errorFromHRESULT("SetWindowTheme", hr) } return nil }
func (wv *WebView) SetURLWithPost(url string, postData netUrl.Values) error { return wv.withWebBrowser2(func(webBrowser2 *win.IWebBrowser2) error { urlBstr := win.StringToVariantBSTR(url) flags := win.IntToVariantI4(0) targetFrameName := win.StringToVariantBSTR("_self") postStr := "" for k, v := range postData { if len(v) == 1 { postStr += k + "=" + netUrl.QueryEscape(v[0]) + "&" } else { for i, _v := range v { postStr += k + "[" + strconv.Itoa(i) + "]=" + netUrl.QueryEscape(_v) + "&" } } } postStr = postStr[:len(postStr)-1] postBstr := unsafe.Pointer(win.StringToVariantBSTR(postStr)) if hr := webBrowser2.Navigate2(urlBstr, flags, targetFrameName, postBstr, nil); win.FAILED(hr) { return errorFromHRESULT("IWebBrowser2.Navigate2", hr) } return nil }) }
func (pi *ProgressIndicator) SetCompleted(completed uint32) error { if hr := pi.taskbarList3.SetProgressValue(pi.hwnd, completed, pi.total); win.FAILED(hr) { return errorFromHRESULT("ITaskbarList3.SetProgressValue", hr) } pi.completed = completed return nil }
func (pi *ProgressIndicator) SetState(state PIState) error { if hr := pi.taskbarList3.SetProgressState(pi.hwnd, (int)(state)); win.FAILED(hr) { return errorFromHRESULT("ITaskbarList3.setprogressState", hr) } pi.state = state return nil }
func (wv *WebView) Refresh() error { return wv.withWebBrowser2(func(webBrowser2 *win.IWebBrowser2) error { if hr := webBrowser2.Refresh(); win.FAILED(hr) { return errorFromHRESULT("IWebBrowser2.Refresh", hr) } return nil }) }
func (wv *WebView) withWebBrowser2(f func(webBrowser2 *win.IWebBrowser2) error) error { var webBrowser2Ptr unsafe.Pointer if hr := wv.browserObject.QueryInterface(&win.IID_IWebBrowser2, &webBrowser2Ptr); win.FAILED(hr) { return errorFromHRESULT("IOleObject.QueryInterface", hr) } webBrowser2 := (*win.IWebBrowser2)(webBrowser2Ptr) defer webBrowser2.Release() return f(webBrowser2) }
func (wv *WebView) GetDocument(iDispatch unsafe.Pointer) error { return wv.withWebBrowser2(func(webBrowser2 *win.IWebBrowser2) error { if hr := webBrowser2.Get_Document(iDispatch); win.FAILED(hr) { return errorFromHRESULT("IWebBrowser2.GetDocument", hr) } return nil }) }
func (wv *WebView) GetBodyHTML() (bodyHTML string, err error) { bodyHTML = "" err = nil wv.withWebBrowser2(func(webBrowser2 *win.IWebBrowser2) error { var doc win.IHTMLDocument2 if hr := webBrowser2.Get_Document(unsafe.Pointer(&(doc.LpVtbl))); win.FAILED(hr) || doc.LpVtbl == nil { err = errorFromHRESULT("IWebBrowser2.GetDocument", hr) return err } var elt win.IHTMLElement if hr := doc.GetBody(&elt); win.FAILED(hr) || elt.LpVtbl == nil { err = errorFromHRESULT("IHTMLElement.GetBody", hr) return err } var cs *uint16 if hr := elt.Get_innerHTML(&cs); win.FAILED(hr) { err = errorFromHRESULT("IHTMLElement.Get_innerHTML", hr) return err } if cs != nil { us := make([]uint16, 0, 256) for p := uintptr(unsafe.Pointer(cs)); ; p += 2 { u := *(*uint16)(unsafe.Pointer(p)) if u == 0 { bodyHTML = syscall.UTF16ToString(us) break } us = append(us, u) } } return nil }) return }
func (wv *WebView) SetURL(url string) error { return wv.withWebBrowser2(func(webBrowser2 *win.IWebBrowser2) error { urlBstr := win.StringToVariantBSTR(url) flags := win.IntToVariantI4(0) targetFrameName := win.StringToVariantBSTR("_self") if hr := webBrowser2.Navigate2(urlBstr, flags, targetFrameName, nil, nil); win.FAILED(hr) { return errorFromHRESULT("IWebBrowser2.Navigate2", hr) } return nil }) }
func (wv *WebView) URL() (url string, err error) { err = wv.withWebBrowser2(func(webBrowser2 *win.IWebBrowser2) error { var urlBstr *uint16 /*BSTR*/ if hr := webBrowser2.Get_LocationURL(&urlBstr); win.FAILED(hr) { return errorFromHRESULT("IWebBrowser2.Get_LocationURL", hr) } defer win.SysFreeString(urlBstr) url = win.BSTRToString(urlBstr) return nil }) return }
func webView_IOleInPlaceSite_OnPosRectChange(inPlaceSite *webViewIOleInPlaceSite, lprcPosRect *win.RECT) uintptr { browserObject := inPlaceSite.inPlaceFrame.webView.browserObject var inPlaceObjectPtr unsafe.Pointer if hr := browserObject.QueryInterface(&win.IID_IOleInPlaceObject, &inPlaceObjectPtr); win.FAILED(hr) { return uintptr(hr) } inPlaceObject := (*win.IOleInPlaceObject)(inPlaceObjectPtr) defer inPlaceObject.Release() return uintptr(inPlaceObject.SetObjectRects(lprcPosRect, lprcPosRect)) }
func NewWebView(parent Container) (*WebView, error) { if hr := win.OleInitialize(); hr != win.S_OK && hr != win.S_FALSE { return nil, newError(fmt.Sprint("OleInitialize Error: ", hr)) } wv := &WebView{ clientSite: webViewIOleClientSite{ IOleClientSite: win.IOleClientSite{ LpVtbl: webViewIOleClientSiteVtbl, }, inPlaceSite: webViewIOleInPlaceSite{ IOleInPlaceSite: win.IOleInPlaceSite{ LpVtbl: webViewIOleInPlaceSiteVtbl, }, inPlaceFrame: webViewIOleInPlaceFrame{ IOleInPlaceFrame: win.IOleInPlaceFrame{ LpVtbl: webViewIOleInPlaceFrameVtbl, }, }, }, docHostUIHandler: webViewIDocHostUIHandler{ IDocHostUIHandler: win.IDocHostUIHandler{ LpVtbl: webViewIDocHostUIHandlerVtbl, }, }, webBrowserEvents2: webViewDWebBrowserEvents2{ DWebBrowserEvents2: win.DWebBrowserEvents2{ LpVtbl: webViewDWebBrowserEvents2Vtbl, }, }, }, } if err := InitWidget( wv, parent, webViewWindowClass, win.WS_CLIPCHILDREN|win.WS_VISIBLE, 0); err != nil { return nil, err } wv.clientSite.inPlaceSite.inPlaceFrame.webView = wv succeeded := false defer func() { if !succeeded { wv.Dispose() } }() var classFactoryPtr unsafe.Pointer if hr := win.CoGetClassObject(&win.CLSID_WebBrowser, win.CLSCTX_INPROC_HANDLER|win.CLSCTX_INPROC_SERVER, nil, &win.IID_IClassFactory, &classFactoryPtr); win.FAILED(hr) { return nil, errorFromHRESULT("CoGetClassObject", hr) } classFactory := (*win.IClassFactory)(classFactoryPtr) defer classFactory.Release() var browserObjectPtr unsafe.Pointer if hr := classFactory.CreateInstance(nil, &win.IID_IOleObject, &browserObjectPtr); win.FAILED(hr) { return nil, errorFromHRESULT("IClassFactory.CreateInstance", hr) } browserObject := (*win.IOleObject)(browserObjectPtr) wv.browserObject = browserObject if hr := browserObject.SetClientSite((*win.IOleClientSite)(unsafe.Pointer(&wv.clientSite))); win.FAILED(hr) { return nil, errorFromHRESULT("IOleObject.SetClientSite", hr) } if hr := browserObject.SetHostNames(syscall.StringToUTF16Ptr("Walk.WebView"), nil); win.FAILED(hr) { return nil, errorFromHRESULT("IOleObject.SetHostNames", hr) } if hr := win.OleSetContainedObject((*win.IUnknown)(unsafe.Pointer(browserObject)), true); win.FAILED(hr) { return nil, errorFromHRESULT("OleSetContainedObject", hr) } var rect win.RECT win.GetClientRect(wv.hWnd, &rect) if hr := browserObject.DoVerb(win.OLEIVERB_SHOW, nil, (*win.IOleClientSite)(unsafe.Pointer(&wv.clientSite)), -1, wv.hWnd, &rect); win.FAILED(hr) { return nil, errorFromHRESULT("IOleObject.DoVerb", hr) } var cpcPtr unsafe.Pointer if hr := browserObject.QueryInterface(&win.IID_IConnectionPointContainer, &cpcPtr); win.FAILED(hr) { return nil, errorFromHRESULT("IOleObject.QueryInterface(IID_IConnectionPointContainer)", hr) } cpc := (*win.IConnectionPointContainer)(cpcPtr) defer cpc.Release() var cp *win.IConnectionPoint if hr := cpc.FindConnectionPoint(&win.DIID_DWebBrowserEvents2, &cp); win.FAILED(hr) { return nil, errorFromHRESULT("IConnectionPointContainer.FindConnectionPoint(DIID_DWebBrowserEvents2)", hr) } defer cp.Release() var cookie uint32 if hr := cp.Advise(unsafe.Pointer(&wv.clientSite.webBrowserEvents2), &cookie); win.FAILED(hr) { return nil, errorFromHRESULT("IConnectionPoint.Advise", hr) } wv.onResize() wv.MustRegisterProperty("URL", NewProperty( func() interface{} { url, _ := wv.URL() return url }, func(v interface{}) error { return wv.SetURL(v.(string)) }, wv.urlChangedPublisher.Event())) succeeded = true return wv, nil }
//newTaskbarList3 precondition: Windows version is at least 6.1 (yes, Win 7 is version 6.1). func newTaskbarList3(hwnd win.HWND) (*ProgressIndicator, error) { var classFactoryPtr unsafe.Pointer if hr := win.CoGetClassObject(&win.CLSID_TaskbarList, win.CLSCTX_ALL, nil, &win.IID_IClassFactory, &classFactoryPtr); win.FAILED(hr) { return nil, errorFromHRESULT("CoGetClassObject", hr) } var taskbarList3ObjectPtr unsafe.Pointer classFactory := (*win.IClassFactory)(classFactoryPtr) defer classFactory.Release() if hr := classFactory.CreateInstance(nil, &win.IID_ITaskbarList3, &taskbarList3ObjectPtr); win.FAILED(hr) { return nil, errorFromHRESULT("IClassFactory.CreateInstance", hr) } return &ProgressIndicator{taskbarList3: (*win.ITaskbarList3)(taskbarList3ObjectPtr), hwnd: hwnd}, nil }