Chandra
view release on metacpan or search on metacpan
include/webview-win32.c view on Meta::CPAN
IOleInPlaceActiveObject *a, IOleCommandTarget *b, IOleInPlaceFrame *c, IOleInPlaceUIWindow *d) {
(void)This; (void)id; (void)a; (void)b; (void)c; (void)d; return S_OK;
}
static HRESULT STDMETHODCALLTYPE uih_HideUI(IDocHostUIHandler *This) { (void)This; return S_OK; }
static HRESULT STDMETHODCALLTYPE uih_UpdateUI(IDocHostUIHandler *This) { (void)This; return S_OK; }
static HRESULT STDMETHODCALLTYPE uih_EnableModeless(IDocHostUIHandler *This, BOOL f) { (void)This; (void)f; return S_OK; }
static HRESULT STDMETHODCALLTYPE uih_OnDocWindowActivate(IDocHostUIHandler *This, BOOL f) { (void)This; (void)f; return S_OK; }
static HRESULT STDMETHODCALLTYPE uih_OnFrameWindowActivate(IDocHostUIHandler *This, BOOL f) { (void)This; (void)f; return S_OK; }
static HRESULT STDMETHODCALLTYPE uih_ResizeBorder(IDocHostUIHandler *This, LPCRECT r, IOleInPlaceUIWindow *w, BOOL f) {
(void)This; (void)r; (void)w; (void)f; return S_OK;
}
static HRESULT STDMETHODCALLTYPE uih_TranslateAccelerator(IDocHostUIHandler *This, LPMSG m, const GUID *g, DWORD d) {
(void)This; (void)m; (void)g; (void)d; return S_FALSE;
}
static HRESULT STDMETHODCALLTYPE uih_GetOptionKeyPath(IDocHostUIHandler *This, LPOLESTR *p, DWORD d) {
(void)This; (void)p; (void)d; return S_FALSE;
}
static HRESULT STDMETHODCALLTYPE uih_GetDropTarget(IDocHostUIHandler *This, IDropTarget *dt, IDropTarget **pdt) {
(void)This; (void)dt; (void)pdt; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE uih_GetExternal(IDocHostUIHandler *This, IDispatch **ppDispatch) {
(void)This; *ppDispatch = NULL; return S_FALSE;
}
static HRESULT STDMETHODCALLTYPE uih_TranslateUrl(IDocHostUIHandler *This, DWORD f, OLECHAR *url, OLECHAR **purl) {
(void)This; (void)f; (void)url; (void)purl; return S_FALSE;
}
static HRESULT STDMETHODCALLTYPE uih_FilterDataObject(IDocHostUIHandler *This, IDataObject *d, IDataObject **pd) {
(void)This; (void)d; (void)pd; return S_FALSE;
}
static IDocHostUIHandlerVtbl ui_handler_vtbl = {
uih_QueryInterface, uih_AddRef, uih_Release,
uih_ShowContextMenu, uih_GetHostInfo, uih_ShowUI,
uih_HideUI, uih_UpdateUI, uih_EnableModeless,
uih_OnDocWindowActivate, uih_OnFrameWindowActivate,
uih_ResizeBorder, uih_TranslateAccelerator,
uih_GetOptionKeyPath, uih_GetDropTarget,
uih_GetExternal, uih_TranslateUrl, uih_FilterDataObject
};
/* ---- QueryInterface / AddRef / Release ---- */
static HRESULT STDMETHODCALLTYPE site_QueryInterface(IOleClientSite *This, REFIID riid, void **ppv) {
WebviewSite *s = (WebviewSite *)This;
*ppv = NULL;
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleClientSite)) {
*ppv = &s->client_site;
} else if (IsEqualIID(riid, &IID_IOleInPlaceSite)) {
*ppv = &s->inplace_site;
} else if (IsEqualIID(riid, &IID_IDocHostUIHandler)) {
*ppv = &s->ui_handler;
} else {
return E_NOINTERFACE;
}
site_AddRef(This);
return S_OK;
}
static ULONG STDMETHODCALLTYPE site_AddRef(IOleClientSite *This) {
WebviewSite *s = (WebviewSite *)This;
return InterlockedIncrement(&s->ref);
}
static ULONG STDMETHODCALLTYPE site_Release(IOleClientSite *This) {
WebviewSite *s = (WebviewSite *)This;
LONG ref = InterlockedDecrement(&s->ref);
if (ref == 0) {
GlobalFree(s);
}
return ref;
}
static WebviewSite *create_site(struct webview *w, HWND hwnd) {
WebviewSite *s = (WebviewSite *)GlobalAlloc(GPTR, sizeof(WebviewSite));
if (!s) return NULL;
s->client_site.lpVtbl = &client_site_vtbl;
s->inplace_site.lpVtbl = &inplace_site_vtbl;
s->inplace_frame.lpVtbl = &inplace_frame_vtbl;
s->ui_handler.lpVtbl = &ui_handler_vtbl;
s->ref = 1;
s->webview = w;
s->hwnd = hwnd;
return s;
}
/* ---- Navigate helper ---- */
static void navigate(IOleObject *browser, const char *url) {
IWebBrowser2 *wb = NULL;
browser->lpVtbl->QueryInterface(browser, &IID_IWebBrowser2, (void **)&wb);
if (wb) {
int len = MultiByteToWideChar(CP_UTF8, 0, url, -1, NULL, 0);
BSTR burl = SysAllocStringLen(NULL, len);
if (burl) {
MultiByteToWideChar(CP_UTF8, 0, url, -1, burl, len);
VARIANT empty;
VariantInit(&empty);
wb->lpVtbl->Navigate(wb, burl, &empty, &empty, &empty, &empty);
SysFreeString(burl);
}
wb->lpVtbl->Release(wb);
}
}
/* ---- Window procedure ---- */
static LRESULT CALLBACK webview_wndproc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
struct webview *w = (struct webview *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
switch (msg) {
case WM_CREATE: {
CREATESTRUCT *cs = (CREATESTRUCT *)lParam;
w = (struct webview *)cs->lpCreateParams;
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)w);
return 0;
}
case WM_SIZE: {
if (w) {
/* Handle WebView2 resize */
if (w->priv.webview2) {
webview2_resize(w);
}
/* Handle MSHTML resize */
else if (w->priv.browser) {
IOleInPlaceObject *ipo = NULL;
w->priv.browser->lpVtbl->QueryInterface(
w->priv.browser, &IID_IOleInPlaceObject, (void **)&ipo);
( run in 0.735 second using v1.01-cache-2.11-cpan-39bf76dae61 )