X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/291a8f20b30f3344b376b61e504c27bd5849e2b1..cdb664d45d2d9e69f568ff1f95b681939719ffcf:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 90bf2685d1..d450141f21 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -24,7 +24,9 @@ #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" #endif +#if wxUSE_TOOLTIPS #include "wx/tooltip.h" +#endif #include "wx/menu.h" #include "wx/statusbr.h" #include "wx/intl.h" @@ -1508,6 +1510,14 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, wxWindow::~wxWindow() { + // Remove potential dangling pointer + if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel))) + { + wxPanel* panel = (wxPanel*) GetParent(); + if (panel->GetLastFocus() == this) + panel->SetLastFocus((wxWindow*) NULL); + } + m_hasVMT = FALSE; #if wxUSE_DRAG_AND_DROP @@ -1716,9 +1726,11 @@ bool wxWindow::Close( bool force ) wxCloseEvent event(wxEVT_CLOSE_WINDOW, m_windowId); event.SetEventObject(this); - event.SetForce(force); + event.SetCanVeto(!force); - return GetEventHandler()->ProcessEvent(event); + // return FALSE if window wasn't closed because the application vetoed the + // close event + return GetEventHandler()->ProcessEvent(event) && !event.GetVeto(); } bool wxWindow::Destroy() @@ -2235,11 +2247,6 @@ bool wxWindow::AcceptsFocus() const return IsEnabled() && IsShown() && m_acceptsFocus; } -bool wxWindow::OnClose() -{ - return TRUE; -} - void wxWindow::AddChild( wxWindow *child ) { wxCHECK_RET( (m_widget != NULL), "invalid window" ); @@ -2417,12 +2424,11 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) { gdk_window_clear_area( m_wxwindow->window, rect->x, rect->y, - rect->width, - rect->height ); + rect->width, rect->height ); } else { - Clear(); + gdk_window_clear( m_wxwindow->window ); } } @@ -2477,7 +2483,10 @@ void wxWindow::Clear() { wxCHECK_RET( m_widget != NULL, "invalid window" ); - if (m_wxwindow && m_wxwindow->window) gdk_window_clear( m_wxwindow->window ); + if (m_wxwindow && m_wxwindow->window) + { + gdk_window_clear( m_wxwindow->window ); + } } #if wxUSE_TOOLTIPS @@ -2530,15 +2539,18 @@ void wxWindow::SetBackgroundColour( const wxColour &colour ) m_backgroundColour = colour; if (!m_backgroundColour.Ok()) return; - if (m_wxwindow) + if (m_wxwindow && m_wxwindow->window) { - GdkWindow *window = m_wxwindow->window; - m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); - gdk_window_set_background( window, m_backgroundColour.GetColor() ); - gdk_window_clear( window ); + /* wxMSW doesn't clear the window here. I don't do that + either to provide compatibility. call Clear() to do + the job. */ + + m_backgroundColour.CalcPixel( gdk_window_get_colormap( m_wxwindow->window ) ); + gdk_window_set_background( m_wxwindow->window, m_backgroundColour.GetColor() ); } wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); + if (sysbg.Red() == colour.Red() && sysbg.Green() == colour.Green() && sysbg.Blue() == colour.Blue()) @@ -2731,6 +2743,8 @@ bool wxWindow::PopupMenu( wxMenu *menu, int x, int y ) SetInvokingWindow( menu, this ); + menu->UpdateUI(); + gs_pop_x = x; gs_pop_y = y;