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

Unified Diff: src/plugin/PluginClass.cpp

Issue 29349925: Issue #4338, #3391 - Remove registered window class for the status bar
Patch Set: Created Aug. 17, 2016, 1:21 p.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 | « src/plugin/PluginClass.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/plugin/PluginClass.cpp
===================================================================
--- a/src/plugin/PluginClass.cpp
+++ b/src/plugin/PluginClass.cpp
@@ -40,6 +40,9 @@
extern CComModule _Module;
+// Status bar pane number
+#define STATUSBAR_PANE_NUMBER 2
+
typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR);
typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPRECT);
typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE);
@@ -55,7 +58,6 @@
DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL;
OPENTHEMEDATA pfnOpenThemeData = NULL;
-ATOM CPluginClass::s_atomPaneClass = NULL;
HINSTANCE CPluginClass::s_hUxtheme = NULL;
std::set<CPluginClass*> CPluginClass::s_instances;
@@ -700,37 +702,6 @@
}
s_criticalSectionLocal.Unlock();
- // Register pane class
- if (!GetAtomPaneClass())
- {
- WNDCLASSEX wcex;
-
- wcex.cbSize = sizeof(wcex);
- wcex.style = 0;
- wcex.lpfnWndProc = (WNDPROC)PaneWindowProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = _Module.m_hInst;
- wcex.hIcon = NULL;
- wcex.hCursor = NULL;
- wcex.hbrBackground = NULL;
- wcex.lpszMenuName = NULL;
- wcex.lpszClassName = STATUSBAR_PANE_NAME;
- wcex.hIconSm = NULL;
-
- s_criticalSectionLocal.Lock();
- {
- s_atomPaneClass = ::RegisterClassEx(&wcex);
- }
- s_criticalSectionLocal.Unlock();
-
- if (!GetAtomPaneClass())
- {
- DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_REGISTER_PANE_CLASS, "Class::InitObject - RegisterClassEx");
- return false;
- }
- }
-
int ieVersion = AdblockPlus::IE::InstalledMajorVersion();
// Create status pane
if (ieVersion > 6 && !CreateStatusBarPane())
@@ -776,6 +747,25 @@
return true;
}
+namespace
+{
+ /**
+ * Wrapper for Windows API 'SetWindowLongPtr()' to set a new window procedure
+ *
+ * Adds type safety and proper error handling over calling the API function directly.
+ */
+ DWORD SetWindowProc(HWND window, WNDPROC procedure)
+ {
+ /*
+ * Error handling for 'SetWindowLongPtr()' is not standard.
+ * The method below is as specified by its documentation.
+ */
+ SetLastError(0);
+ ::SetWindowLongPtr(window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(procedure));
+ return ::GetLastError();
+ }
+}
+
bool CPluginClass::CreateStatusBarPane()
{
CriticalSection::Lock lock(m_csStatusBar);
@@ -902,8 +892,8 @@
// Create pane window
HWND hWndNewPane = ::CreateWindowEx(
NULL,
- MAKEINTATOM(GetAtomPaneClass()),
- L"",
+ L"Edit", // predefined system class
+ L"ABPStatusBarPane",
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
rcStatusBar.Width() - 500, 0, m_nPaneWidth, rcStatusBar.Height(),
hWndStatusBar,
@@ -917,6 +907,15 @@
return false;
}
+ // Set window procedure to the one for status bars
+ auto error = SetWindowProc(hWndNewPane, CPluginClass::PaneWindowProc);
+ if (error)
+ {
+ DEBUG_ERROR_LOG(error, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_CREATE_STATUSBAR_PANE, "Class::SetStatusBarPaneWindowProc - SetWindowProc");
+ ::DestroyWindow(hWndNewPane);
+ return false;
+ }
+
DEBUG_GENERAL("ABP window created");
m_hTabWnd = hTabWnd;
m_hStatusBarWnd = hWndStatusBar;
@@ -1069,8 +1068,8 @@
// Create menu parent window
HWND hMenuWnd = ::CreateWindowEx(
NULL,
- MAKEINTATOM(GetAtomPaneClass()),
- L"",
+ L"Edit", // predefined system class
+ L"ABPStatusBarPopupMenu",
0,
0,0,0,0,
NULL,
@@ -1084,6 +1083,15 @@
return;
}
+ // Set window procedure to the one for status bars.
+ auto error = SetWindowProc(hMenuWnd, CPluginClass::PaneWindowProc);
+ if (error)
+ {
+ DEBUG_ERROR_LOG(error, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_CREATE_STATUSBAR_PANE, "Class::DisplayPluginMenu - SetWindowProc");
+ ::DestroyWindow(hMenuWnd);
+ return;
+ }
+
// Display menu
nMenuFlags |= TPM_NONOTIFY | TPM_RETURNCMD | TPM_LEFTBUTTON;
@@ -1729,9 +1737,3 @@
return icon;
}
-
-ATOM CPluginClass::GetAtomPaneClass()
-{
- return s_atomPaneClass;
-}
-
« no previous file with comments | « src/plugin/PluginClass.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld