From 4230cb24de770f36281efbfcdd6a93f39342a222 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 28 May 2018 23:10:13 +0200 Subject: [PATCH] Add WXWNDPROC typedef and use it in wxMSW instead of WXFARPROC WNDPROC and FARPROC are not the same thing in MSW and it's wrong to use WXFARPROC as the type of different window procedures we use. Introduce WXWNDPROC which is more clear and correct and use it instead. Also get rid of a few casts which are not necessary any longer. --- include/wx/defs.h | 7 +++++++ include/wx/msw/private.h | 2 +- include/wx/msw/spinctrl.h | 4 ++-- include/wx/msw/window.h | 6 +++--- src/msw/notebook.cpp | 9 ++++----- src/msw/radiobox.cpp | 4 ++-- src/msw/spinctrl.cpp | 3 +-- src/msw/window.cpp | 9 ++++----- 8 files changed, 24 insertions(+), 20 deletions(-) diff --git a/include/wx/defs.h b/include/wx/defs.h index 1cb8ad1794..d483bf87dd 100644 --- a/include/wx/defs.h +++ b/include/wx/defs.h @@ -2845,11 +2845,18 @@ typedef wxW64 long WXLPARAM; typedef wxW64 long WXLRESULT; #endif +/* + This is defined for compatibility only, it's not really the same thing as + FARPROC. + */ #if defined(__GNUWIN32__) typedef int (*WXFARPROC)(); #else typedef int (__stdcall *WXFARPROC)(); #endif + +typedef WXLRESULT (wxSTDCALL *WXWNDPROC)(WXHWND, WXUINT, WXWPARAM, WXLPARAM); + #endif /* __WIN32__ */ diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index 40f6bcf6e6..4cb366ee3e 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -939,7 +939,7 @@ extern WXDLLIMPEXP_CORE int wxGetWindowId(WXHWND hWnd); // // wndProc parameter is unused and only kept for compatibility extern WXDLLIMPEXP_CORE -bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc = NULL); +bool wxCheckWindowWndProc(WXHWND hWnd, WXWNDPROC wndProc = NULL); // Does this window style specify any border? inline bool wxStyleHasBorder(long style) diff --git a/include/wx/msw/spinctrl.h b/include/wx/msw/spinctrl.h index 85363bf57d..612ca4bba2 100644 --- a/include/wx/msw/spinctrl.h +++ b/include/wx/msw/spinctrl.h @@ -100,7 +100,7 @@ public: // for internal use only // get the subclassed window proc of the buddy text - WXFARPROC GetBuddyWndProc() const { return m_wndProcBuddy; } + WXWNDPROC GetBuddyWndProc() const { return m_wndProcBuddy; } // return the spinctrl object whose buddy is the given window or NULL static wxSpinCtrl *GetSpinForTextCtrl(WXHWND hwndBuddy); @@ -145,7 +145,7 @@ protected: // the data for the "buddy" text ctrl WXHWND m_hwndBuddy; - WXFARPROC m_wndProcBuddy; + WXWNDPROC m_wndProcBuddy; // Block text update event after SetValue() bool m_blockEvent; diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index 8ea5f8725d..dd8741dcd7 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -206,8 +206,8 @@ public: void SubclassWin(WXHWND hWnd); void UnsubclassWin(); - WXFARPROC MSWGetOldWndProc() const { return m_oldWndProc; } - void MSWSetOldWndProc(WXFARPROC proc) { m_oldWndProc = proc; } + WXWNDPROC MSWGetOldWndProc() const { return m_oldWndProc; } + void MSWSetOldWndProc(WXWNDPROC proc) { m_oldWndProc = proc; } // return true if the window is of a standard (i.e. not wxWidgets') class // @@ -597,7 +597,7 @@ protected: WXHWND m_hWnd; // the old window proc (we subclass all windows) - WXFARPROC m_oldWndProc; + WXWNDPROC m_oldWndProc; // additional (MSW specific) flags bool m_mouseInWindow:1; diff --git a/src/msw/notebook.cpp b/src/msw/notebook.cpp index 62fa2d61b3..21d3f7ab69 100644 --- a/src/msw/notebook.cpp +++ b/src/msw/notebook.cpp @@ -81,10 +81,10 @@ #if USE_NOTEBOOK_ANTIFLICKER // the pointer to standard spin button wnd proc -static WXFARPROC gs_wndprocNotebookSpinBtn = (WXFARPROC)NULL; +static WXWNDPROC gs_wndprocNotebookSpinBtn = NULL; // the pointer to standard tab control wnd proc -static WXFARPROC gs_wndprocNotebook = (WXFARPROC)NULL; +static WXWNDPROC gs_wndprocNotebook = NULL; LRESULT APIENTRY wxNotebookWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); @@ -202,8 +202,7 @@ bool wxNotebook::Create(wxWindow *parent, if ( ::GetClassInfo(NULL, WC_TABCONTROL, &wc) ) { - gs_wndprocNotebook = - reinterpret_cast(wc.lpfnWndProc); + gs_wndprocNotebook = wc.lpfnWndProc; wc.lpszClassName = wxT("_wx_SysTabCtl32"); wc.style &= ~(CS_HREDRAW | CS_VREDRAW); wc.hInstance = wxGetInstance(); @@ -996,7 +995,7 @@ void wxNotebook::OnSize(wxSizeEvent& event) { // subclass the spin button to override WM_ERASEBKGND if ( !gs_wndprocNotebookSpinBtn ) - gs_wndprocNotebookSpinBtn = (WXFARPROC)wxGetWindowProc(child); + gs_wndprocNotebookSpinBtn = wxGetWindowProc(child); wxSetWindowProc(child, wxNotebookSpinBtnWndProc); m_hasSubclassedUpdown = true; diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 7ed9d135ee..43a69bbc3e 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -113,7 +113,7 @@ namespace { // the pointer to standard radio button wnd proc -WXFARPROC s_wndprocRadioBtn = (WXFARPROC)NULL; +WXWNDPROC s_wndprocRadioBtn = NULL; // Hash allowing to find wxRadioBox containing the given radio button by its // HWND. This is used by (subclassed) radio button window proc to find the @@ -298,7 +298,7 @@ void wxRadioBox::SubclassRadioButton(WXHWND hWndBtn) HWND hwndBtn = (HWND)hWndBtn; if ( !s_wndprocRadioBtn ) - s_wndprocRadioBtn = (WXFARPROC)wxGetWindowProc(hwndBtn); + s_wndprocRadioBtn = wxGetWindowProc(hwndBtn); wxSetWindowProc(hwndBtn, wxRadioBtnWndProc); diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index adc534b01a..1e4e09cd46 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -329,8 +329,7 @@ bool wxSpinCtrl::Create(wxWindow *parent, // subclass the text ctrl to be able to intercept some events gs_spinForTextCtrl[GetBuddyHwnd()] = this; - m_wndProcBuddy = (WXFARPROC)wxSetWindowProc(GetBuddyHwnd(), - wxBuddyTextWndProc); + m_wndProcBuddy = wxSetWindowProc(GetBuddyHwnd(), wxBuddyTextWndProc); // associate the text window with the spin button (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0); diff --git a/src/msw/window.cpp b/src/msw/window.cpp index db5e757c7f..2da6726752 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -1248,7 +1248,7 @@ void wxWindowMSW::SubclassWin(WXHWND hWnd) wxAssociateWinWithHandle(hwnd, this); - m_oldWndProc = (WXFARPROC)wxGetWindowProc((HWND)hWnd); + m_oldWndProc = wxGetWindowProc((HWND)hWnd); // we don't need to subclass the window of our own class (in the Windows // sense of the word) @@ -1291,7 +1291,7 @@ void wxWindowMSW::UnsubclassWin() { if ( !wxCheckWindowWndProc((WXHWND)hwnd) ) { - wxSetWindowProc(hwnd, (WNDPROC)m_oldWndProc); + wxSetWindowProc(hwnd, m_oldWndProc); } m_oldWndProc = NULL; @@ -1322,8 +1322,7 @@ void wxWindowMSW::DissociateHandle() } -bool wxCheckWindowWndProc(WXHWND hWnd, - WXFARPROC WXUNUSED(wndProc)) +bool wxCheckWindowWndProc(WXHWND hWnd, WXWNDPROC WXUNUSED(wndProc)) { const wxString str(wxGetWindowClass(hWnd)); @@ -2408,7 +2407,7 @@ WXLRESULT wxWindowMSW::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM l { WXLRESULT rc; if ( m_oldWndProc ) - rc = ::CallWindowProc(CASTWNDPROC m_oldWndProc, GetHwnd(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); + rc = ::CallWindowProc(m_oldWndProc, GetHwnd(), nMsg, wParam, lParam); else rc = ::DefWindowProc(GetHwnd(), nMsg, wParam, lParam);