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 )