Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/plugin/PluginClass.cpp

Issue 6032593782833152: Issue 1173 - proposal for entry point (Closed)
Patch Set: Created Jan. 13, 2015, 11:40 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/plugin/PluginUtil.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/plugin/PluginClass.cpp
diff --git a/src/plugin/PluginClass.cpp b/src/plugin/PluginClass.cpp
index 40a588413c802d75f564256c36800105100146d5..862ec4609acec989c2f9a4091fc447b7470bd4d1 100644
--- a/src/plugin/PluginClass.cpp
+++ b/src/plugin/PluginClass.cpp
@@ -202,163 +202,166 @@ DWORD WINAPI CPluginClass::StartInitObject(LPVOID thisPtr)
// so we should handle that it is called this way several times during a session
STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite)
{
- CPluginSettings* settings = CPluginSettings::GetInstance();
-
- MULTIPLE_VERSIONS_CHECK();
-
- if (unknownSite)
+ return EntryPointWithHResult([&]()->HRESULT
{
-
- DEBUG_GENERAL(L"================================================================================\nNEW TAB UI\n================================================================================")
-
- HRESULT hr = ::CoInitialize(NULL);
- if (FAILED(hr))
- {
- DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, "Class::SetSite - CoInitialize");
- }
-
- s_criticalSectionBrowser.Lock();
- {
- m_webBrowser2 = unknownSite;
- }
- s_criticalSectionBrowser.Unlock();
-
- //register the mimefilter
- //and only mimefilter
- //on some few computers the mimefilter does not get properly registered when it is done on another thread
-
- s_criticalSectionLocal.Lock();
- {
- // Always register on startup, then check if we need to unregister in a separate thread
- s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance();
- s_asyncWebBrowser2 = unknownSite;
- s_instances.insert(this);
- }
- s_criticalSectionLocal.Unlock();
-
- try
+ CPluginSettings* settings = CPluginSettings::GetInstance();
+
+ MULTIPLE_VERSIONS_CHECK();
+
+ if (unknownSite)
{
- // Check if loaded as BHO
- auto webBrowser = GetBrowser();
- if (webBrowser)
+
+ DEBUG_GENERAL(L"================================================================================\nNEW TAB UI\n================================================================================")
+
+ HRESULT hr = ::CoInitialize(NULL);
+ if (FAILED(hr))
{
- DEBUG_GENERAL("Loaded as BHO");
- HRESULT hr = DispEventAdvise(webBrowser);
- if (SUCCEEDED(hr))
+ DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_COINIT, "Class::SetSite - CoInitialize");
+ }
+
+ s_criticalSectionBrowser.Lock();
+ {
+ m_webBrowser2 = unknownSite;
+ }
+ s_criticalSectionBrowser.Unlock();
+
+ //register the mimefilter
+ //and only mimefilter
+ //on some few computers the mimefilter does not get properly registered when it is done on another thread
+
+ s_criticalSectionLocal.Lock();
+ {
+ // Always register on startup, then check if we need to unregister in a separate thread
+ s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance();
+ s_asyncWebBrowser2 = unknownSite;
+ s_instances.insert(this);
+ }
+ s_criticalSectionLocal.Unlock();
+
+ try
+ {
+ // Check if loaded as BHO
+ auto webBrowser = GetBrowser();
+ if (webBrowser)
{
- m_isAdvised = true;
- try
+ DEBUG_GENERAL("Loaded as BHO");
+ HRESULT hr = DispEventAdvise(webBrowser);
+ if (SUCCEEDED(hr))
{
- std::thread startInitObjectThread(StartInitObject, this);
- startInitObjectThread.detach(); // TODO: but actually we should wait for the thread in the dtr.
+ m_isAdvised = true;
+ try
+ {
+ std::thread startInitObjectThread(StartInitObject, this);
+ startInitObjectThread.detach(); // TODO: but actually we should wait for the thread in the dtr.
+ }
+ catch (const std::system_error& ex)
+ {
+ auto errDescription = std::string("Class::Thread - Failed to create StartInitObject thread, ") +
+ ex.code().message() + ex.what();
+ DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_THREAD_CREATE_PROCESS, errDescription.c_str());
+ }
}
- catch (const std::system_error& ex)
+ else
{
- auto errDescription = std::string("Class::Thread - Failed to create StartInitObject thread, ") +
- ex.code().message() + ex.what();
- DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_THREAD_CREATE_PROCESS, errDescription.c_str());
+ DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVICE, "Class::SetSite - Advice");
}
}
- else
- {
- DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVICE, "Class::SetSite - Advice");
- }
- }
- else // Check if loaded as toolbar handler
- {
- DEBUG_GENERAL("Loaded as toolbar handler");
- CComPtr<IServiceProvider> pServiceProvider;
-
- HRESULT hr = unknownSite->QueryInterface(&pServiceProvider);
- if (SUCCEEDED(hr))
+ else // Check if loaded as toolbar handler
{
- if (pServiceProvider)
+ DEBUG_GENERAL("Loaded as toolbar handler");
+ CComPtr<IServiceProvider> pServiceProvider;
+
+ HRESULT hr = unknownSite->QueryInterface(&pServiceProvider);
+ if (SUCCEEDED(hr))
{
- s_criticalSectionBrowser.Lock();
+ if (pServiceProvider)
{
- HRESULT hr = pServiceProvider->QueryService(IID_IWebBrowserApp, &m_webBrowser2);
- if (SUCCEEDED(hr))
+ s_criticalSectionBrowser.Lock();
{
- if (m_webBrowser2)
+ HRESULT hr = pServiceProvider->QueryService(IID_IWebBrowserApp, &m_webBrowser2);
+ if (SUCCEEDED(hr))
{
- InitObject(false);
+ if (m_webBrowser2)
+ {
+ InitObject(false);
+ }
+ }
+ else
+ {
+ DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUERY_BROWSER, "Class::SetSite - QueryService (IID_IWebBrowserApp)");
}
}
- else
- {
- DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUERY_BROWSER, "Class::SetSite - QueryService (IID_IWebBrowserApp)");
- }
+ s_criticalSectionBrowser.Unlock();
}
- s_criticalSectionBrowser.Unlock();
+ }
+ else
+ {
+ DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUERY_SERVICE_PROVIDER, "Class::SetSite - QueryInterface (service provider)");
}
}
- else
- {
- DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_QUERY_SERVICE_PROVIDER, "Class::SetSite - QueryInterface (service provider)");
- }
+ }
+ catch (std::runtime_error e)
+ {
+ DEBUG_ERROR(e.what());
+ Unadvise();
}
}
- catch (std::runtime_error e)
+ else
{
- DEBUG_ERROR(e.what());
Unadvise();
- }
- }
- else
- {
- Unadvise();
-
- // Destroy window
- if (m_pWndProcStatus)
- {
- ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWndProcStatus);
-
- m_pWndProcStatus = NULL;
- }
-
- if (m_hPaneWnd)
- {
- DestroyWindow(m_hPaneWnd);
- m_hPaneWnd = NULL;
- }
-
- m_hTabWnd = NULL;
- m_hStatusBarWnd = NULL;
-
- // Remove instance from the list, shutdown threads
- HANDLE hMainThread = NULL;
- HANDLE hTabThread = NULL;
-
- s_criticalSectionLocal.Lock();
- {
- s_instances.erase(this);
-
- std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::GetCurrentThreadId());
- if (it != s_threadInstances.end())
+
+ // Destroy window
+ if (m_pWndProcStatus)
{
- s_threadInstances.erase(it);
+ ::SetWindowLongPtr(m_hStatusBarWnd, GWLP_WNDPROC, (LPARAM)(WNDPROC)m_pWndProcStatus);
+
+ m_pWndProcStatus = NULL;
}
- if (s_instances.empty())
+
+ if (m_hPaneWnd)
{
- // TODO: Explicitly releasing a resource when a container becomes empty looks like a job better suited for shared_ptr
- CPluginClientFactory::ReleaseMimeFilterClientInstance();
+ DestroyWindow(m_hPaneWnd);
+ m_hPaneWnd = NULL;
}
+
+ m_hTabWnd = NULL;
+ m_hStatusBarWnd = NULL;
+
+ // Remove instance from the list, shutdown threads
+ HANDLE hMainThread = NULL;
+ HANDLE hTabThread = NULL;
+
+ s_criticalSectionLocal.Lock();
+ {
+ s_instances.erase(this);
+
+ std::map<DWORD,CPluginClass*>::iterator it = s_threadInstances.find(::GetCurrentThreadId());
+ if (it != s_threadInstances.end())
+ {
+ s_threadInstances.erase(it);
+ }
+ if (s_instances.empty())
+ {
+ // TODO: Explicitly releasing a resource when a container becomes empty looks like a job better suited for shared_ptr
+ CPluginClientFactory::ReleaseMimeFilterClientInstance();
+ }
+ }
+ s_criticalSectionLocal.Unlock();
+
+ // Release browser interface
+ s_criticalSectionBrowser.Lock();
+ {
+ m_webBrowser2.Release();
+ }
+ s_criticalSectionBrowser.Unlock();
+
+ DEBUG_GENERAL("================================================================================\nNEW TAB UI - END\n================================================================================")
+
+ ::CoUninitialize();
}
- s_criticalSectionLocal.Unlock();
-
- // Release browser interface
- s_criticalSectionBrowser.Lock();
- {
- m_webBrowser2.Release();
- }
- s_criticalSectionBrowser.Unlock();
-
- DEBUG_GENERAL("================================================================================\nNEW TAB UI - END\n================================================================================")
-
- ::CoUninitialize();
- }
-
- return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite);
+
+ return IObjectWithSiteImpl<CPluginClass>::SetSite(unknownSite);
+ });
}
bool CPluginClass::IsStatusBarEnabled()
@@ -483,127 +486,145 @@ void STDMETHODCALLTYPE CPluginClass::OnBeforeNavigate2(
/* [in] */ VARIANT* /*Headers*/,
/* [in, out] */ VARIANT_BOOL* /*Cancel*/)
{
- ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp;
- if (!webBrowser)
- {
- return;
- }
-
- if (!urlVariant || urlVariant->vt != VT_BSTR)
- {
- return;
- }
- std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal));
- UnescapeUrl(url);
-
- //Register a mime filter if it's not registered yet
- if (s_mimeFilter == NULL)
- {
- s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance();
- }
-
- CString urlCString = ToCString(url);
-
- // If webbrowser2 is equal to top level browser (as set in SetSite), we are navigating new page
- CPluginClient* client = CPluginClient::GetInstance();
-
- if (urlCString.Find(L"javascript") == 0)
+ EntryPoint([&]
{
- }
- else if (GetBrowser().IsEqualObject(webBrowser))
- {
- m_tab->OnNavigate(urlCString);
-
- DEBUG_GENERAL(L"================================================================================\nBegin main navigation url:" + urlCString + "\n================================================================================")
-
+ ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp;
+ if (!webBrowser)
+ {
+ return;
+ }
+
+ if (!urlVariant || urlVariant->vt != VT_BSTR)
+ {
+ return;
+ }
+ std::wstring url(urlVariant->bstrVal, SysStringLen(urlVariant->bstrVal));
+ UnescapeUrl(url);
+
+ //Register a mime filter if it's not registered yet
+ if (s_mimeFilter == NULL)
+ {
+ s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance();
+ }
+
+ CString urlCString = ToCString(url);
+
+ // If webbrowser2 is equal to top level browser (as set in SetSite), we are navigating new page
+ CPluginClient* client = CPluginClient::GetInstance();
+
+ if (urlCString.Find(L"javascript") == 0)
+ {
+ }
+ else if (GetBrowser().IsEqualObject(webBrowser))
+ {
+ m_tab->OnNavigate(urlCString);
+
+ DEBUG_GENERAL(L"================================================================================\nBegin main navigation url:" + urlCString + "\n================================================================================")
+
#ifdef ENABLE_DEBUG_RESULT
- CPluginDebug::DebugResultDomain(urlCString);
+ CPluginDebug::DebugResultDomain(urlCString);
#endif
-
- UpdateStatusBar();
- }
- else
- {
- DEBUG_NAVI(L"Navi::Begin navigation url:" + urlCString)
- m_tab->CacheFrame(urlCString);
- }
+
+ UpdateStatusBar();
+ }
+ else
+ {
+ DEBUG_NAVI(L"Navi::Begin navigation url:" + urlCString)
+ m_tab->CacheFrame(urlCString);
+ }
+ });
}
void STDMETHODCALLTYPE CPluginClass::OnDownloadBegin()
{
- DEBUG_NAVI("Navi::Download Begin")
+ EntryPoint([&]
+ {
+ DEBUG_NAVI("Navi::Download Begin")
+ });
}
void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete()
{
- DEBUG_NAVI("Navi::Download Complete")
- ATL::CComPtr<IWebBrowser2> browser = GetBrowser();
- if (browser)
+ EntryPoint([&]
{
- m_tab->OnDownloadComplete(browser);
- }
+ DEBUG_NAVI("Navi::Download Complete")
+ ATL::CComPtr<IWebBrowser2> browser = GetBrowser();
+ if (browser)
+ {
+ m_tab->OnDownloadComplete(browser);
+ }
+ });
}
void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserDisp, VARIANT* /*urlOrPidl*/)
{
- ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp;
- if (!webBrowser2)
+ EntryPoint([&]
{
- return;
- }
- ATL::CString frameSrc;
- ATL::CComBSTR locationUrl;
- if (FAILED(webBrowser2->get_LocationURL(&locationUrl)) && !!locationUrl)
- {
- return;
- }
- frameSrc = locationUrl;
- CPluginClient::UnescapeUrl(frameSrc);
- bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2);
- m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser);
+ ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp;
+ if (!webBrowser2)
+ {
+ return;
+ }
+ ATL::CString frameSrc;
+ ATL::CComBSTR locationUrl;
+ if (FAILED(webBrowser2->get_LocationURL(&locationUrl)) && !!locationUrl)
+ {
+ return;
+ }
+ frameSrc = locationUrl;
+ CPluginClient::UnescapeUrl(frameSrc);
+ bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2);
+ m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser);
+ });
}
void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, unsigned long validFlagsMask)
{
- DEBUG_GENERAL("Tab changed");
- bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENABLED)
- && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENABLED);
- if (newtabshown)
+ EntryPoint([&]
{
- std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(GetCurrentThreadId());
- if (it == s_threadInstances.end())
+ DEBUG_GENERAL("Tab changed");
+ bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENABLED)
+ && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENABLED);
+ if (newtabshown)
{
- s_threadInstances[::GetCurrentThreadId()] = this;
- if (!m_isInitializedOk)
+ std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(GetCurrentThreadId());
+ if (it == s_threadInstances.end())
{
- m_isInitializedOk = true;
- InitObject(true);
- UpdateStatusBar();
+ s_threadInstances[::GetCurrentThreadId()] = this;
+ if (!m_isInitializedOk)
+ {
+ m_isInitializedOk = true;
+ InitObject(true);
+ UpdateStatusBar();
+ }
}
}
- }
- notificationMessage.Hide();
- DEBUG_GENERAL("Tab change end");
+ notificationMessage.Hide();
+ DEBUG_GENERAL("Tab change end");
+ });
}
void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARIANT_BOOL /*enable*/)
{
- if (m_hPaneWnd == NULL)
- {
- CreateStatusBarPane();
- }
- else
+ EntryPoint([&]
{
- if (AdblockPlus::IE::InstalledMajorVersion() > 6)
+ if (m_hPaneWnd == NULL)
{
- RECT rect;
- BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect);
- if (rectRes == TRUE)
+ CreateStatusBarPane();
+ }
+ else
+ {
+ if (AdblockPlus::IE::InstalledMajorVersion() > 6)
{
- MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.bottom - rect.top, TRUE);
+ RECT rect;
+ BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect);
+ if (rectRes == TRUE)
+ {
+ MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.bottom - rect.top, TRUE);
+ }
}
}
- }
+ });
}
bool CPluginClass::InitObject(bool bBHO)
@@ -982,12 +1003,15 @@ CPluginTab* CPluginClass::GetTab(DWORD dwThreadId)
STDMETHODIMP CPluginClass::QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText)
{
- if (cCmds == 0) return E_INVALIDARG;
- if (prgCmds == 0) return E_POINTER;
-
- prgCmds[0].cmdf = OLECMDF_ENABLED;
-
- return S_OK;
+ return EntryPointWithHResult([&]()->HRESULT
+ {
+ if (cCmds == 0) return E_INVALIDARG;
+ if (prgCmds == 0) return E_POINTER;
+
+ prgCmds[0].cmdf = OLECMDF_ENABLED;
+
+ return S_OK;
+ });
}
HMENU CPluginClass::CreatePluginMenu(const CString& url)
@@ -1192,83 +1216,86 @@ bool CPluginClass::SetMenuBar(HMENU hMenu, const CString& url)
STDMETHODIMP CPluginClass::Exec(const GUID*, DWORD nCmdID, DWORD, VARIANTARG*, VARIANTARG*)
{
- HWND hBrowserWnd = GetBrowserHWND();
- if (!hBrowserWnd)
- {
- return E_FAIL;
- }
-
- // Create menu
- HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl());
- if (!hMenu)
- {
- return E_FAIL;
- }
-
- // Check if button in toolbar was pressed
- int nIDCommand = -1;
- BOOL bRightAlign = FALSE;
-
- POINT pt;
- GetCursorPos(&pt);
-
- HWND hWndToolBar = ::WindowFromPoint(pt);
-
- DWORD nProcessId;
- ::GetWindowThreadProcessId(hWndToolBar, &nProcessId);
-
- if (hWndToolBar && ::GetCurrentProcessId() == nProcessId)
+ return EntryPointWithHResult([&]()->HRESULT
{
- ::ScreenToClient(hWndToolBar, &pt);
- int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0, (LPARAM)&pt);
-
- if (nButton > 0)
+ HWND hBrowserWnd = GetBrowserHWND();
+ if (!hBrowserWnd)
{
- TBBUTTON pTBBtn = {};
-
- if (SendMessage(hWndToolBar, TB_GETBUTTON, nButton, (LPARAM)&pTBBtn))
+ return E_FAIL;
+ }
+
+ // Create menu
+ HMENU hMenu = CreatePluginMenu(m_tab->GetDocumentUrl());
+ if (!hMenu)
+ {
+ return E_FAIL;
+ }
+
+ // Check if button in toolbar was pressed
+ int nIDCommand = -1;
+ BOOL bRightAlign = FALSE;
+
+ POINT pt;
+ GetCursorPos(&pt);
+
+ HWND hWndToolBar = ::WindowFromPoint(pt);
+
+ DWORD nProcessId;
+ ::GetWindowThreadProcessId(hWndToolBar, &nProcessId);
+
+ if (hWndToolBar && ::GetCurrentProcessId() == nProcessId)
+ {
+ ::ScreenToClient(hWndToolBar, &pt);
+ int nButton = (int)::SendMessage(hWndToolBar, TB_HITTEST, 0, (LPARAM)&pt);
+
+ if (nButton > 0)
{
- RECT rcButton;
- nIDCommand = pTBBtn.idCommand;
-
- if (SendMessage(hWndToolBar, TB_GETRECT, nIDCommand, (LPARAM)&rcButton))
+ TBBUTTON pTBBtn = {};
+
+ if (SendMessage(hWndToolBar, TB_GETBUTTON, nButton, (LPARAM)&pTBBtn))
{
- pt.x = rcButton.left;
- pt.y = rcButton.bottom;
- ClientToScreen(hWndToolBar, &pt);
-
- RECT rcWorkArea;
- SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID)&rcWorkArea, 0);
- if (rcWorkArea.right - pt.x < 150)
+ RECT rcButton;
+ nIDCommand = pTBBtn.idCommand;
+
+ if (SendMessage(hWndToolBar, TB_GETRECT, nIDCommand, (LPARAM)&rcButton))
{
- bRightAlign = TRUE;
- pt.x = rcButton.right;
+ pt.x = rcButton.left;
pt.y = rcButton.bottom;
ClientToScreen(hWndToolBar, &pt);
+
+ RECT rcWorkArea;
+ SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID)&rcWorkArea, 0);
+ if (rcWorkArea.right - pt.x < 150)
+ {
+ bRightAlign = TRUE;
+ pt.x = rcButton.right;
+ pt.y = rcButton.bottom;
+ ClientToScreen(hWndToolBar, &pt);
+ }
}
}
}
+ else
+ {
+ GetCursorPos(&pt);
+ }
+ }
+
+ // Display menu
+ UINT nFlags = 0;
+ if (bRightAlign)
+ {
+ nFlags |= TPM_RIGHTALIGN;
}
else
{
- GetCursorPos(&pt);
+ nFlags |= TPM_LEFTALIGN;
}
- }
-
- // Display menu
- UINT nFlags = 0;
- if (bRightAlign)
- {
- nFlags |= TPM_RIGHTALIGN;
- }
- else
- {
- nFlags |= TPM_LEFTALIGN;
- }
-
- DisplayPluginMenu(hMenu, nIDCommand, pt, nFlags);
-
- return S_OK;
+
+ DisplayPluginMenu(hMenu, nIDCommand, pt, nFlags);
+
+ return S_OK;
+ });
}
/////////////////////////////////////////////////////////////////////////////
@@ -1596,7 +1623,10 @@ void CPluginClass::UpdateStatusBar()
void STDMETHODCALLTYPE CPluginClass::OnOnQuit()
{
- Unadvise();
+ EntryPoint([&]
+ {
+ Unadvise();
+ });
}
void CPluginClass::Unadvise()
« no previous file with comments | « no previous file | src/plugin/PluginUtil.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld