From 328f3691c1a59fe92104d15a088293ef9d59d44d Mon Sep 17 00:00:00 2001 From: Piotr Piastucki Date: Mon, 10 Aug 2015 12:16:50 +0000 Subject: Fixed MSN IEEmbed window to support accelerator keys. git-svn-id: http://svn.miranda-ng.org/main/trunk@14896 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/MSN/src/msn_auth.cpp | 8 +-- protocols/MSN/src/msn_ieembed.cpp | 108 ++++++++++++++++++++++++++++++++++++++ protocols/MSN/src/msn_ieembed.h | 14 ++++- 3 files changed, 124 insertions(+), 6 deletions(-) (limited to 'protocols/MSN') diff --git a/protocols/MSN/src/msn_auth.cpp b/protocols/MSN/src/msn_auth.cpp index 0a7cff86bf..e9dde450aa 100644 --- a/protocols/MSN/src/msn_auth.cpp +++ b/protocols/MSN/src/msn_auth.cpp @@ -730,6 +730,8 @@ void CMsnProto::SaveAuthTokensDB(void) } typedef struct { + /* Internal */ + IEEmbed *pEmbed; /* Input */ CMsnProto *pProto; NETLIBHTTPREQUEST *nlhr; @@ -737,8 +739,6 @@ typedef struct { /* Output */ char *pszURL; char *pszCookies; - /* Internal */ - IEEmbed *pEmbed; } IEAUTH_PARAM; LRESULT CALLBACK AuthWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -755,9 +755,9 @@ LRESULT CALLBACK AuthWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar case WM_CREATE: { IEAUTH_PARAM *pAuth = (IEAUTH_PARAM*)((LPCREATESTRUCT)lParam)->lpCreateParams; + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pAuth); pAuth->pEmbed = new IEEmbed(hwnd); WCHAR *pwszCookies = mir_a2u(pAuth->nlhr->headers[1].szValue); - SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pAuth); pAuth->pEmbed->addCookie(pwszCookies); pAuth->pEmbed->navigate(AUTH_URL); mir_free(pwszCookies); @@ -966,7 +966,7 @@ int CMsnProto::MSN_AuthOAuth(void) * window in order to let user login there. May also be used for 2-factor auth */ if (nlhrReply2->resultCode == 200 && nlhrReply2->pData) { UINT uThreadId; - IEAUTH_PARAM param = {this, &nlhr, nlhrReply2, NULL, NULL, NULL}; + IEAUTH_PARAM param = {NULL, this, &nlhr, nlhrReply2, NULL, NULL}; bAskingForAuth = true; WaitForSingleObject(ForkThreadEx(&CMsnProto::msn_IEAuthThread, ¶m, &uThreadId), INFINITE); diff --git a/protocols/MSN/src/msn_ieembed.cpp b/protocols/MSN/src/msn_ieembed.cpp index ef9ce64285..f231bbafed 100644 --- a/protocols/MSN/src/msn_ieembed.cpp +++ b/protocols/MSN/src/msn_ieembed.cpp @@ -114,6 +114,70 @@ void IEEmbedSink::SetSecureLockIcon(long) {} void IEEmbedSink::FileDownload(VARIANT_BOOL*) {} +static LRESULT CALLBACK IEEmbedServerWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + IEEmbed **view = (IEEmbed **)GetWindowLongPtr(GetParent(GetParent(GetParent(hwnd))), GWLP_USERDATA); + if (view && *view) { + switch (message) { + /* + case WM_KEYUP: + if (LOWORD(wParam) == VK_ESCAPE && !(GetKeyState(VK_SHIFT) & 0x8000) && !(GetKeyState(VK_CONTROL) & 0x8000) && !(GetKeyState(VK_MENU) & 0x8000)) + SendMessage(GetParent(GetParent(GetParent(hwnd))), WM_COMMAND, IDCANCEL, 0); + break; */ + + case WM_KEYDOWN: + (*view)->translateAccelerator(message, wParam, lParam); + break; + + /* + case WM_SETFOCUS: + RECT rcWindow; + POINT cursor; + GetWindowRect(hwnd, &rcWindow); + GetCursorPos(&cursor); + if (cursor.y <= rcWindow.bottom && cursor.y >= rcWindow.top && cursor.x <= rcWindow.right && cursor.x >= rcWindow.left) + view->mouseActivate(); + + if (view->setFocus((HWND)wParam)) + return TRUE; + break; + */ + + } + return CallWindowProc((*view)->getServerWndProc(), hwnd, message, wParam, lParam); + } + return DefWindowProc(hwnd, message, wParam, lParam); +} + +static LRESULT CALLBACK IEEmbedDocWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + IEEmbed **view = (IEEmbed **)GetWindowLongPtr(GetParent(GetParent(hwnd)), GWLP_USERDATA); + if (view && *view) { + WNDPROC oldWndProc = (*view)->getDocWndProc(); + if (message == WM_PARENTNOTIFY && wParam == WM_CREATE) { + SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)oldWndProc); + (*view)->setServerWndProc((WNDPROC)SetWindowLongPtr((HWND)lParam, GWLP_WNDPROC, (LONG_PTR)IEEmbedServerWindowProcedure)); + } + return CallWindowProc(oldWndProc, hwnd, message, wParam, lParam); + } + return DefWindowProc(hwnd, message, wParam, lParam); +} + +static LRESULT CALLBACK IEEmbedWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + IEEmbed **view = (IEEmbed **)GetWindowLongPtr(GetParent(hwnd), GWLP_USERDATA); + if (view && *view) { + WNDPROC oldWndProc = (*view)->getMainWndProc(); + if (message == WM_PARENTNOTIFY && wParam == WM_CREATE) { + SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)oldWndProc); + (*view)->setDocWndProc((WNDPROC)SetWindowLongPtr((HWND)lParam, GWLP_WNDPROC, (LONG_PTR)IEEmbedDocWindowProcedure)); + } + return CallWindowProc(oldWndProc, hwnd, message, wParam, lParam); + } + return DefWindowProc(hwnd, message, wParam, lParam); +} + + IEEmbed::IEEmbed(HWND _parent) { MSG msg; @@ -147,6 +211,8 @@ IEEmbed::IEEmbed(HWND _parent) MessageBox(NULL, TranslateT("Failed to Advise"), TranslateT("C++ Event Sink"), MB_OK); } } + setMainWndProc((WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)IEEmbedWindowProcedure)); + SetFocus(hwnd); } pWebBrowser->put_RegisterAsDropTarget(VARIANT_FALSE); @@ -253,6 +319,36 @@ STDMETHODIMP IEEmbed::OnShowWindow(BOOL) { return E_NOTIMPL; } STDMETHODIMP IEEmbed::RequestNewObjectLayout(void) { return E_NOTIMPL; } +void IEEmbed::setMainWndProc(WNDPROC wndProc) +{ + mainWndProc = wndProc; +} + +WNDPROC IEEmbed::getMainWndProc() +{ + return mainWndProc; +} + +void IEEmbed::setDocWndProc(WNDPROC wndProc) +{ + docWndProc = wndProc; +} + +WNDPROC IEEmbed::getDocWndProc() +{ + return docWndProc; +} + +void IEEmbed::setServerWndProc(WNDPROC wndProc) +{ + serverWndProc = wndProc; +} + +WNDPROC IEEmbed::getServerWndProc() +{ + return serverWndProc; +} + void IEEmbed::write(const wchar_t *text) { CComPtr document = getDocument(); @@ -363,3 +459,15 @@ char *IEEmbed::GetHTMLDoc() { } return pszRet; } + +void IEEmbed::translateAccelerator(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + CComPtr pIOIPAO; + if (SUCCEEDED(pWebBrowser.QueryInterface(&pIOIPAO))) { + MSG msg; + msg.message = uMsg; + msg.wParam = wParam; + msg.lParam = lParam; + pIOIPAO->TranslateAccelerator(&msg); + } +} diff --git a/protocols/MSN/src/msn_ieembed.h b/protocols/MSN/src/msn_ieembed.h index 76442b691d..2726fced13 100644 --- a/protocols/MSN/src/msn_ieembed.h +++ b/protocols/MSN/src/msn_ieembed.h @@ -77,9 +77,9 @@ public: STDMETHODIMP_(void)FileDownload(VARIANT_BOOL*); }; -class IEEmbed :public IDispatch, public IOleClientSite, public IOleInPlaceSite //, public IDocHostUIHandler +class IEEmbed :public IDispatch, public IOleClientSite, public IOleInPlaceSite { -public: +private: HWND parent; HWND hwnd; int m_cRef; @@ -88,7 +88,9 @@ public: CComPtr m_pConnectionPoint; CComPtr pWebBrowser; IEEmbedSink *sink; + WNDPROC mainWndProc, docWndProc, serverWndProc; +public: // IUnknown STDMETHODIMP QueryInterface(REFIID riid, PVOID *ppv); STDMETHODIMP_(ULONG) AddRef(void); @@ -128,6 +130,13 @@ public: IEEmbed(HWND _parent); virtual ~IEEmbed(); + void setMainWndProc(WNDPROC); + WNDPROC getMainWndProc(); + void setDocWndProc(WNDPROC); + WNDPROC getDocWndProc(); + void setServerWndProc(WNDPROC); + WNDPROC getServerWndProc(); + void ResizeBrowser(); void navigate(const wchar_t *); void navigate(char *url); @@ -136,5 +145,6 @@ public: void addCookie(const wchar_t *cookieString); BSTR getCookies(); char* GetHTMLDoc(); + void translateAccelerator(UINT uMsg, WPARAM wParam, LPARAM lParam); }; #endif -- cgit v1.2.3