From 83707a975d9edf37f3343bf7c32c38cf6b2f9cf1 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 25 Dec 2023 14:44:15 +0100 Subject: [PATCH 1/2] Use ProcessEvent() in wxAuiNotebook code No real changes, just replace GetEventHandler()->ProcessEvent() with the calls to this function, which does exactly the same thing, but is shorter and more clear. --- src/aui/auibook.cpp | 60 ++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/aui/auibook.cpp b/src/aui/auibook.cpp index 035e763edb..5931186b1b 100644 --- a/src/aui/auibook.cpp +++ b/src/aui/auibook.cpp @@ -1081,7 +1081,7 @@ void wxAuiTabCtrl::OnLeftDown(wxMouseEvent& evt) e.SetSelection(new_selection); e.SetOldSelection(GetActivePage()); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } m_clickPt.x = evt.m_x; @@ -1110,7 +1110,7 @@ void wxAuiTabCtrl::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) evt.SetSelection(GetIdxFromWindow(clickTab)); evt.SetOldSelection(evt.GetSelection()); evt.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); + ProcessWindowEvent(evt); } } @@ -1129,7 +1129,7 @@ void wxAuiTabCtrl::OnLeftUp(wxMouseEvent& evt) e.SetSelection(GetIdxFromWindow(clickTab)); e.SetOldSelection(e.GetSelection()); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); return; } @@ -1157,7 +1157,7 @@ void wxAuiTabCtrl::OnLeftUp(wxMouseEvent& evt) e.SetSelection(GetIdxFromWindow(m_clickTab)); e.SetInt(m_pressedButton->id); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } m_pressedButton = nullptr; @@ -1175,7 +1175,7 @@ void wxAuiTabCtrl::OnMiddleUp(wxMouseEvent& evt) wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, m_windowId); e.SetEventObject(this); e.SetSelection(GetIdxFromWindow(wnd)); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } void wxAuiTabCtrl::OnMiddleDown(wxMouseEvent& evt) @@ -1187,7 +1187,7 @@ void wxAuiTabCtrl::OnMiddleDown(wxMouseEvent& evt) wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, m_windowId); e.SetEventObject(this); e.SetSelection(GetIdxFromWindow(wnd)); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } void wxAuiTabCtrl::OnRightUp(wxMouseEvent& evt) @@ -1199,7 +1199,7 @@ void wxAuiTabCtrl::OnRightUp(wxMouseEvent& evt) wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, m_windowId); e.SetEventObject(this); e.SetSelection(GetIdxFromWindow(wnd)); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } void wxAuiTabCtrl::OnRightDown(wxMouseEvent& evt) @@ -1211,7 +1211,7 @@ void wxAuiTabCtrl::OnRightDown(wxMouseEvent& evt) wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, m_windowId); e.SetEventObject(this); e.SetSelection(GetIdxFromWindow(wnd)); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } void wxAuiTabCtrl::OnLeftDClick(wxMouseEvent& evt) @@ -1222,7 +1222,7 @@ void wxAuiTabCtrl::OnLeftDClick(wxMouseEvent& evt) { wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_BG_DCLICK, m_windowId); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } } @@ -1295,7 +1295,7 @@ void wxAuiTabCtrl::OnMotion(wxMouseEvent& evt) e.SetSelection(GetIdxFromWindow(m_clickTab)); e.SetOldSelection(e.GetSelection()); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); return; } @@ -1310,7 +1310,7 @@ void wxAuiTabCtrl::OnMotion(wxMouseEvent& evt) e.SetSelection(GetIdxFromWindow(m_clickTab)); e.SetOldSelection(e.GetSelection()); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); m_isDragging = true; } @@ -1361,7 +1361,7 @@ void wxAuiTabCtrl::OnButton(wxAuiNotebookEvent& event) e.SetSelection(idx); e.SetOldSelection(GetActivePage()); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } } else @@ -1437,7 +1437,7 @@ void wxAuiTabCtrl::OnChar(wxKeyEvent& event) keyEvent.SetFromTab(bFromTab); keyEvent.SetEventObject(nb); - if (!nb->GetEventHandler()->ProcessEvent(keyEvent)) + if (!nb->ProcessWindowEvent(keyEvent)) { // Not processed? Do an explicit tab into the page. wxWindow* win = GetWindowFromIdx(GetActivePage()); @@ -1504,7 +1504,7 @@ void wxAuiTabCtrl::OnChar(wxKeyEvent& event) e.SetSelection(newPage); e.SetOldSelection(newPage); e.SetEventObject(this); - this->GetEventHandler()->ProcessEvent(e); + this->ProcessWindowEvent(e); } else event.Skip(); @@ -2311,7 +2311,7 @@ void wxAuiNotebook::SetSelectionToWindow(wxWindow *win) if (parent) { wxChildFocusEvent eventFocus(this); - parent->GetEventHandler()->ProcessEvent(eventFocus); + parent->ProcessWindowEvent(eventFocus); } @@ -2570,7 +2570,7 @@ void wxAuiNotebook::OnTabBgDClick(wxAuiNotebookEvent& evt) // notify owner that the tabbar background has been double-clicked wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_BG_DCLICK, m_windowId); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } void wxAuiNotebook::OnTabBeginDrag(wxAuiNotebookEvent&) @@ -2758,7 +2758,7 @@ void wxAuiNotebook::OnTabEndDrag(wxAuiNotebookEvent& evt) e.SetDragSource(this); e.Veto(); // dropping must be explicitly approved by control owner - nb->GetEventHandler()->ProcessEvent(e); + nb->ProcessWindowEvent(e); if (!e.IsAllowed()) { @@ -2829,7 +2829,7 @@ void wxAuiNotebook::OnTabEndDrag(wxAuiNotebookEvent& evt) e2.SetSelection(evt.GetSelection()); e2.SetOldSelection(evt.GetSelection()); e2.SetEventObject(this); - GetEventHandler()->ProcessEvent(e2); + ProcessWindowEvent(e2); return; } @@ -2940,7 +2940,7 @@ void wxAuiNotebook::OnTabEndDrag(wxAuiNotebookEvent& evt) e.SetSelection(evt.GetSelection()); e.SetOldSelection(evt.GetSelection()); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } @@ -3139,7 +3139,7 @@ void wxAuiNotebook::OnNavigationKeyNotebook(wxNavigationKeyEvent& event) event.SetEventObject(this); wxWindow *page = GetPage(GetSelection()); - if ( !page->GetEventHandler()->ProcessEvent(event) ) + if ( !page->ProcessWindowEvent(event) ) { page->SetFocus(); } @@ -3163,7 +3163,7 @@ void wxAuiNotebook::OnNavigationKeyNotebook(wxNavigationKeyEvent& event) else if ( parent ) { event.SetCurrentFocus(this); - parent->GetEventHandler()->ProcessEvent(event); + parent->ProcessWindowEvent(event); } } } @@ -3197,7 +3197,7 @@ void wxAuiNotebook::OnTabButton(wxAuiNotebookEvent& evt) e.SetSelection(idx); e.SetOldSelection(evt.GetSelection()); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); if (!e.IsAllowed()) return; @@ -3220,7 +3220,7 @@ void wxAuiNotebook::OnTabButton(wxAuiNotebookEvent& evt) wxAuiNotebookEvent e2(wxEVT_AUINOTEBOOK_PAGE_CLOSED, m_windowId); e2.SetSelection(idx); e2.SetEventObject(this); - GetEventHandler()->ProcessEvent(e2); + ProcessWindowEvent(e2); } } } @@ -3235,7 +3235,7 @@ void wxAuiNotebook::OnTabMiddleDown(wxAuiNotebookEvent& evt) wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_MIDDLE_DOWN, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(wnd)); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } void wxAuiNotebook::OnTabMiddleUp(wxAuiNotebookEvent& evt) @@ -3251,7 +3251,7 @@ void wxAuiNotebook::OnTabMiddleUp(wxAuiNotebookEvent& evt) wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_MIDDLE_UP, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(wnd)); e.SetEventObject(this); - if (GetEventHandler()->ProcessEvent(e)) + if (ProcessWindowEvent(e)) return; if (!e.IsAllowed()) return; @@ -3274,7 +3274,7 @@ void wxAuiNotebook::OnTabRightDown(wxAuiNotebookEvent& evt) wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(wnd)); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } void wxAuiNotebook::OnTabRightUp(wxAuiNotebookEvent& evt) @@ -3286,7 +3286,7 @@ void wxAuiNotebook::OnTabRightUp(wxAuiNotebookEvent& evt) wxAuiNotebookEvent e(wxEVT_AUINOTEBOOK_TAB_RIGHT_UP, m_windowId); e.SetSelection(m_tabs.GetIdxFromWindow(wnd)); e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); } // Sets the normal font @@ -3354,7 +3354,7 @@ bool wxAuiNotebook::ShowWindowMenu() e.SetSelection(idx); e.SetOldSelection(tabCtrl->GetActivePage()); e.SetEventObject(tabCtrl); - GetEventHandler()->ProcessEvent(e); + ProcessWindowEvent(e); return true; } @@ -3632,7 +3632,7 @@ int wxAuiNotebook::DoModifySelection(size_t n, bool events) evt.SetSelection(n); evt.SetOldSelection(m_curPage); evt.SetEventObject(this); - GetEventHandler()->ProcessEvent(evt); + ProcessWindowEvent(evt); vetoed = !evt.IsAllowed(); } @@ -3678,7 +3678,7 @@ int wxAuiNotebook::DoModifySelection(size_t n, bool events) if(events) { evt.SetEventType(wxEVT_AUINOTEBOOK_PAGE_CHANGED); - (void)GetEventHandler()->ProcessEvent(evt); + (void)ProcessWindowEvent(evt); } return old_curpage; From 18bba7b70be1f225009931937a8a52d342308593 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 25 Dec 2023 15:01:15 +0100 Subject: [PATCH 2/2] Document correct way of handling wxAuiNotebookEvents They need to be handled at wxAuiNotebook level as they are all processed there and don't propagate up to the parent. Closes #24118. --- interface/wx/aui/auibook.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/interface/wx/aui/auibook.h b/interface/wx/aui/auibook.h index c8d6510f78..d00f54140e 100644 --- a/interface/wx/aui/auibook.h +++ b/interface/wx/aui/auibook.h @@ -114,6 +114,9 @@ enum wxAuiNotebookOption Double clicked on the tabs background area. Processes a @c wxEVT_AUINOTEBOOK_BG_DCLICK event. @endEventTable + Please see the note in wxAuiNotebookEvent documentation about handling + these events. + @library{wxaui} @category{aui} */ @@ -712,6 +715,13 @@ public: This class is used by the events generated by wxAuiNotebook. + Please note that most events generated by wxAuiNotebook are handled by the + notebook object itself, i.e. they do _not_ propagate upwards to the + notebook parent window, in spite of being command events. In order to + handle these events you should use wxEvtHandler::Bind() to connect to the + events on the notebook object itself and don't forget to use + wxEvent::Skip() to ensure that the notebook still processes them too. + @beginEventEmissionTable{wxAuiNotebookEvent} @event{EVT_AUINOTEBOOK_PAGE_CLOSE(id, func)} A page is about to be closed. Processes a @c wxEVT_AUINOTEBOOK_PAGE_CLOSE event.