diff --git a/include/wx/event.h b/include/wx/event.h index e934c01419..009336ade7 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -762,10 +762,17 @@ public: void SetLoggingOff(bool logOff) { m_loggingOff = logOff; } bool GetLoggingOff() const { return m_loggingOff; } - void Veto(bool veto = TRUE) { wxASSERT( m_canVeto ); m_veto = veto; } + void Veto(bool veto = TRUE) + { + // GetVeto() will return FALSE anyhow... + wxCHECK_RET( m_canVeto, + "call to Veto() ignored (can't veto this event)" ); + + m_veto = veto; + } void SetCanVeto(bool canVeto) { m_canVeto = canVeto; } bool CanVeto() const { return m_canVeto; } - bool GetVeto() const { wxASSERT( m_canVeto ); return m_veto; } + bool GetVeto() const { return m_canVeto && m_veto; } #if WXWIN_COMPATIBILITY // This is probably obsolete now, since we use CanVeto instead, in diff --git a/include/wx/gtk/dialog.h b/include/wx/gtk/dialog.h index d896ea47dd..be05cebb0f 100644 --- a/include/wx/gtk/dialog.h +++ b/include/wx/gtk/dialog.h @@ -63,12 +63,12 @@ public: void OnOK( wxCommandEvent &event ); void OnPaint( wxPaintEvent& event ); void OnSize( wxSizeEvent &event ); + void OnCloseWindow( wxCloseEvent& event ); /* void OnCharHook( wxKeyEvent& event ); */ bool Destroy(); - void OnCloseWindow( wxCloseEvent& event ); virtual void SetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO ); diff --git a/include/wx/gtk/frame.h b/include/wx/gtk/frame.h index 7fcfc639e3..829a83fc5f 100644 --- a/include/wx/gtk/frame.h +++ b/include/wx/gtk/frame.h @@ -64,13 +64,13 @@ public: virtual void GetClientSize( int *width, int *height ) const; wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); } - + virtual void SetClientSize( int const width, int const height ); virtual void SetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO ); virtual void SetSize( int width, int height ); - + virtual wxStatusBar* CreateStatusBar(int number=1, long style = wxST_SIZEGRIP, wxWindowID id = 0, const wxString& name = "statusBar"); virtual wxStatusBar *OnCreateStatusBar( int number, long style, wxWindowID id, @@ -99,14 +99,14 @@ public: virtual void Maximize(bool WXUNUSED(maximize)) {} virtual void Restore() {} + void OnCloseWindow( wxCloseEvent& event ); void OnActivate( wxActivateEvent &WXUNUSED(event) ) { } // called from docview.cpp void OnSize( wxSizeEvent &event ); - void OnCloseWindow( wxCloseEvent& event ); - + void OnMenuHighlight( wxMenuEvent& event ); // implementation - + virtual void GtkOnSize( int x, int y, int width, int height ); virtual wxPoint GetClientAreaOrigin() const; void DoMenuUpdates(); diff --git a/include/wx/gtk1/dialog.h b/include/wx/gtk1/dialog.h index d896ea47dd..be05cebb0f 100644 --- a/include/wx/gtk1/dialog.h +++ b/include/wx/gtk1/dialog.h @@ -63,12 +63,12 @@ public: void OnOK( wxCommandEvent &event ); void OnPaint( wxPaintEvent& event ); void OnSize( wxSizeEvent &event ); + void OnCloseWindow( wxCloseEvent& event ); /* void OnCharHook( wxKeyEvent& event ); */ bool Destroy(); - void OnCloseWindow( wxCloseEvent& event ); virtual void SetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO ); diff --git a/include/wx/gtk1/frame.h b/include/wx/gtk1/frame.h index 7fcfc639e3..829a83fc5f 100644 --- a/include/wx/gtk1/frame.h +++ b/include/wx/gtk1/frame.h @@ -64,13 +64,13 @@ public: virtual void GetClientSize( int *width, int *height ) const; wxSize GetClientSize() const { int w, h; GetClientSize(& w, & h); return wxSize(w, h); } - + virtual void SetClientSize( int const width, int const height ); virtual void SetSize( int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO ); virtual void SetSize( int width, int height ); - + virtual wxStatusBar* CreateStatusBar(int number=1, long style = wxST_SIZEGRIP, wxWindowID id = 0, const wxString& name = "statusBar"); virtual wxStatusBar *OnCreateStatusBar( int number, long style, wxWindowID id, @@ -99,14 +99,14 @@ public: virtual void Maximize(bool WXUNUSED(maximize)) {} virtual void Restore() {} + void OnCloseWindow( wxCloseEvent& event ); void OnActivate( wxActivateEvent &WXUNUSED(event) ) { } // called from docview.cpp void OnSize( wxSizeEvent &event ); - void OnCloseWindow( wxCloseEvent& event ); - + void OnMenuHighlight( wxMenuEvent& event ); // implementation - + virtual void GtkOnSize( int x, int y, int width, int height ); virtual wxPoint GetClientAreaOrigin() const; void DoMenuUpdates(); diff --git a/src/gtk/dialog.cpp b/src/gtk/dialog.cpp index 16bd99d503..4a0e3abd26 100644 --- a/src/gtk/dialog.cpp +++ b/src/gtk/dialog.cpp @@ -224,15 +224,15 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event) if (closing.Member(this)) return; // no loops + if ( event.GetVeto() ) + return; + closing.Append(this); wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); cancelEvent.SetEventObject( this ); GetEventHandler()->ProcessEvent(cancelEvent); closing.DeleteObject(this); - - if ( event.CanVeto() ) - event.Veto(); } bool wxDialog::Destroy() diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index b96f0a96b2..25e187d39b 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -8,7 +8,7 @@ ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation "frame.h" + #pragma implementation "frame.h" #endif #include "wx/frame.h" @@ -104,6 +104,7 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC BEGIN_EVENT_TABLE(wxFrame, wxWindow) EVT_SIZE(wxFrame::OnSize) + EVT_CLOSE(wxFrame::OnCloseWindow) EVT_MENU_HIGHLIGHT_ALL(wxFrame::OnMenuHighlight) END_EVENT_TABLE() @@ -474,6 +475,13 @@ void wxFrame::OnInternalIdle() DoMenuUpdates(); } +void wxFrame::OnCloseWindow( wxCloseEvent& event ) +{ + // close the window if it wasn't vetoed by the application + if ( !event.GetVeto() ) + Destroy(); +} + void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) ) { wxASSERT_MSG( (m_widget != NULL), "invalid frame" ); diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 4c95e23186..ac31501f9b 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1718,13 +1718,9 @@ bool wxWindow::Close( bool force ) event.SetEventObject(this); event.SetCanVeto(!force); - (void)GetEventHandler()->ProcessEvent(event); - - // when we're forced to close we do it anyhow, otherwise only if the - // application didn't forbid it (if the event wasn't processed, GetVeto() - // will return FALSE too) - if ( force || !event.GetVeto() ) - Destroy(); + // return FALSE if window wasn't closed because the application vetoed the + // close event + return GetEventHandler()->ProcessEvent(event) && !event.GetVeto(); } bool wxWindow::Destroy() diff --git a/src/gtk1/dialog.cpp b/src/gtk1/dialog.cpp index 16bd99d503..4a0e3abd26 100644 --- a/src/gtk1/dialog.cpp +++ b/src/gtk1/dialog.cpp @@ -224,15 +224,15 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event) if (closing.Member(this)) return; // no loops + if ( event.GetVeto() ) + return; + closing.Append(this); wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); cancelEvent.SetEventObject( this ); GetEventHandler()->ProcessEvent(cancelEvent); closing.DeleteObject(this); - - if ( event.CanVeto() ) - event.Veto(); } bool wxDialog::Destroy() diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index b96f0a96b2..25e187d39b 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -8,7 +8,7 @@ ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation "frame.h" + #pragma implementation "frame.h" #endif #include "wx/frame.h" @@ -104,6 +104,7 @@ static gint gtk_frame_configure_callback( GtkWidget *WXUNUSED(widget), GdkEventC BEGIN_EVENT_TABLE(wxFrame, wxWindow) EVT_SIZE(wxFrame::OnSize) + EVT_CLOSE(wxFrame::OnCloseWindow) EVT_MENU_HIGHLIGHT_ALL(wxFrame::OnMenuHighlight) END_EVENT_TABLE() @@ -474,6 +475,13 @@ void wxFrame::OnInternalIdle() DoMenuUpdates(); } +void wxFrame::OnCloseWindow( wxCloseEvent& event ) +{ + // close the window if it wasn't vetoed by the application + if ( !event.GetVeto() ) + Destroy(); +} + void wxFrame::OnSize( wxSizeEvent &WXUNUSED(event) ) { wxASSERT_MSG( (m_widget != NULL), "invalid frame" ); diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 4c95e23186..ac31501f9b 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1718,13 +1718,9 @@ bool wxWindow::Close( bool force ) event.SetEventObject(this); event.SetCanVeto(!force); - (void)GetEventHandler()->ProcessEvent(event); - - // when we're forced to close we do it anyhow, otherwise only if the - // application didn't forbid it (if the event wasn't processed, GetVeto() - // will return FALSE too) - if ( force || !event.GetVeto() ) - Destroy(); + // return FALSE if window wasn't closed because the application vetoed the + // close event + return GetEventHandler()->ProcessEvent(event) && !event.GetVeto(); } bool wxWindow::Destroy()