Chandra

 view release on metacpan or  search on metacpan

include/webview-win32.c  view on Meta::CPAN

  lpFrameInfo->haccel = NULL;
  lpFrameInfo->cAccelEntries = 0;
  return S_OK;
}
static HRESULT STDMETHODCALLTYPE ips_Scroll(IOleInPlaceSite *This, SIZE s) {
  (void)This; (void)s; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE ips_OnUIDeactivate(IOleInPlaceSite *This, BOOL f) {
  (void)This; (void)f; return S_OK;
}
static HRESULT STDMETHODCALLTYPE ips_OnInPlaceDeactivate(IOleInPlaceSite *This) {
  (void)This; return S_OK;
}
static HRESULT STDMETHODCALLTYPE ips_DiscardUndoState(IOleInPlaceSite *This) {
  (void)This; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE ips_DeactivateAndUndo(IOleInPlaceSite *This) {
  (void)This; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE ips_OnPosRectChange(IOleInPlaceSite *This, LPCRECT lprcPosRect) {
  (void)This; (void)lprcPosRect; return S_OK;
}

static IOleInPlaceSiteVtbl inplace_site_vtbl = {
  ips_QueryInterface, ips_AddRef, ips_Release,
  (HRESULT(STDMETHODCALLTYPE *)(IOleInPlaceSite *, HWND *))ips_GetWindow,
  ips_ContextSensitiveHelp,
  ips_CanInPlaceActivate, ips_OnInPlaceActivate, ips_OnUIActivate,
  ips_GetWindowContext, ips_Scroll, ips_OnUIDeactivate,
  ips_OnInPlaceDeactivate, ips_DiscardUndoState, ips_DeactivateAndUndo,
  ips_OnPosRectChange
};

/* ---- IOleInPlaceFrame (minimal) ---- */

static HRESULT STDMETHODCALLTYPE ipf_QueryInterface(IOleInPlaceFrame *This, REFIID riid, void **ppv) {
  (void)This; (void)riid; *ppv = NULL; return E_NOINTERFACE;
}
static ULONG STDMETHODCALLTYPE ipf_AddRef(IOleInPlaceFrame *This) { (void)This; return 1; }
static ULONG STDMETHODCALLTYPE ipf_Release(IOleInPlaceFrame *This) { (void)This; return 1; }
static HRESULT STDMETHODCALLTYPE ipf_GetWindow(IOleInPlaceFrame *This, HWND *phwnd) {
  WebviewSite *s = (WebviewSite *)((char *)This - offsetof(WebviewSite, inplace_frame));
  *phwnd = s->hwnd;
  return S_OK;
}
static HRESULT STDMETHODCALLTYPE ipf_ContextSensitiveHelp(IOleInPlaceFrame *This, BOOL f) {
  (void)This; (void)f; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE ipf_GetBorder(IOleInPlaceFrame *This, LPRECT r) {
  (void)This; (void)r; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE ipf_RequestBorderSpace(IOleInPlaceFrame *This, LPCBORDERWIDTHS b) {
  (void)This; (void)b; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE ipf_SetBorderSpace(IOleInPlaceFrame *This, LPCBORDERWIDTHS b) {
  (void)This; (void)b; return S_OK;
}
static HRESULT STDMETHODCALLTYPE ipf_SetActiveObject(IOleInPlaceFrame *This, IOleInPlaceActiveObject *a, LPCOLESTR s) {
  (void)This; (void)a; (void)s; return S_OK;
}
static HRESULT STDMETHODCALLTYPE ipf_InsertMenus(IOleInPlaceFrame *This, HMENU h, LPOLEMENUGROUPWIDTHS m) {
  (void)This; (void)h; (void)m; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE ipf_SetMenu(IOleInPlaceFrame *This, HMENU a, HOLEMENU b, HWND c) {
  (void)This; (void)a; (void)b; (void)c; return S_OK;
}
static HRESULT STDMETHODCALLTYPE ipf_RemoveMenus(IOleInPlaceFrame *This, HMENU h) {
  (void)This; (void)h; return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE ipf_SetStatusText(IOleInPlaceFrame *This, LPCOLESTR s) {
  (void)This; (void)s; return S_OK;
}
static HRESULT STDMETHODCALLTYPE ipf_EnableModeless(IOleInPlaceFrame *This, BOOL f) {
  (void)This; (void)f; return S_OK;
}
static HRESULT STDMETHODCALLTYPE ipf_TranslateAccelerator(IOleInPlaceFrame *This, LPMSG m, WORD w) {
  (void)This; (void)m; (void)w; return E_NOTIMPL;
}

static IOleInPlaceFrameVtbl inplace_frame_vtbl = {
  ipf_QueryInterface, ipf_AddRef, ipf_Release,
  (HRESULT(STDMETHODCALLTYPE *)(IOleInPlaceFrame *, HWND *))ipf_GetWindow,
  ipf_ContextSensitiveHelp,
  ipf_GetBorder, ipf_RequestBorderSpace, ipf_SetBorderSpace,
  ipf_SetActiveObject, ipf_InsertMenus, ipf_SetMenu, ipf_RemoveMenus,
  ipf_SetStatusText, ipf_EnableModeless, ipf_TranslateAccelerator
};

/* ---- IDocHostUIHandler ---- */

static HRESULT STDMETHODCALLTYPE uih_QueryInterface(IDocHostUIHandler *This, REFIID riid, void **ppv) {
  WebviewSite *s = (WebviewSite *)((char *)This - offsetof(WebviewSite, ui_handler));
  return site_QueryInterface(&s->client_site, riid, ppv);
}
static ULONG STDMETHODCALLTYPE uih_AddRef(IDocHostUIHandler *This) {
  WebviewSite *s = (WebviewSite *)((char *)This - offsetof(WebviewSite, ui_handler));
  return site_AddRef(&s->client_site);
}
static ULONG STDMETHODCALLTYPE uih_Release(IDocHostUIHandler *This) {
  WebviewSite *s = (WebviewSite *)((char *)This - offsetof(WebviewSite, ui_handler));
  return site_Release(&s->client_site);
}
static HRESULT STDMETHODCALLTYPE uih_ShowContextMenu(IDocHostUIHandler *This, DWORD id,
    POINT *pt, IUnknown *pcmdtReserved, IDispatch *pdispReserved) {
  (void)This; (void)id; (void)pt; (void)pcmdtReserved; (void)pdispReserved;
  return S_OK; /* Suppress default context menu */
}
static HRESULT STDMETHODCALLTYPE uih_GetHostInfo(IDocHostUIHandler *This, DOCHOSTUIINFO *pInfo) {
  (void)This;
  pInfo->cbSize = sizeof(DOCHOSTUIINFO);
  pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
  pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
  return S_OK;
}
static HRESULT STDMETHODCALLTYPE uih_ShowUI(IDocHostUIHandler *This, DWORD id,
    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);



( run in 0.941 second using v1.01-cache-2.11-cpan-39bf76dae61 )