X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/20239453d57b635b6e578c4e46ef02b198512733..22d5903e91cebda4d9614515b05cc9a894306278:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index b47572ba4e..e3a3a49f5d 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -9,7 +9,7 @@ #ifdef __GNUG__ -#pragma implementation "window.h" + #pragma implementation "window.h" #endif #include "wx/defs.h" @@ -21,12 +21,15 @@ #include "wx/utils.h" #include "wx/dialog.h" #include "wx/msgdlg.h" + #if wxUSE_DRAG_AND_DROP -#include "wx/dnd.h" + #include "wx/dnd.h" #endif + #if wxUSE_TOOLTIPS -#include "wx/tooltip.h" + #include "wx/tooltip.h" #endif + #include "wx/menu.h" #include "wx/statusbr.h" #include "wx/intl.h" @@ -122,11 +125,9 @@ // conditional compilation //------------------------------------------------------------------------- -#if (GTK_MINOR_VERSION == 1) -#if (GTK_MICRO_VERSION >= 5) +#if (GTK_MINOR_VERSION > 0) #define NEW_GTK_SCROLL_CODE #endif -#endif //----------------------------------------------------------------------------- // (debug) @@ -168,7 +169,6 @@ void debug_focus_in( GtkWidget* widget, const char* name, const char *window ) //----------------------------------------------------------------------------- extern wxList wxPendingDelete; -extern wxList wxTopLevelWindows; extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; static bool g_capturing = FALSE; @@ -1078,6 +1078,7 @@ static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * float diff = win->m_vAdjust->value - win->m_oldVerticalPos; if (fabs(diff) < 0.2) return; + win->m_oldVerticalPos = win->m_vAdjust->value; wxEventType command = wxEVT_NULL; @@ -1125,6 +1126,7 @@ static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * float diff = win->m_hAdjust->value - win->m_oldHorizontalPos; if (fabs(diff) < 0.2) return; + win->m_oldHorizontalPos = win->m_hAdjust->value; wxEventType command = wxEVT_NULL; @@ -1306,8 +1308,10 @@ BEGIN_EVENT_TABLE(wxWindow, wxEvtHandler) EVT_KEY_DOWN(wxWindow::OnKeyDown) END_EVENT_TABLE() -wxWindow::wxWindow() +void wxWindow::Init() { + m_isWindow = TRUE; + m_widget = (GtkWidget *) NULL; m_wxwindow = (GtkWidget *) NULL; m_parent = (wxWindow *) NULL; @@ -1374,11 +1378,17 @@ wxWindow::wxWindow() #endif // wxUSE_TOOLTIPS } +wxWindow::wxWindow() +{ + Init(); +} + wxWindow::wxWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) { - m_insertCallback = wxInsertChildInWindow; + Init(); + Create( parent, id, pos, size, style, name ); } @@ -1386,9 +1396,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) { - m_isShown = FALSE; - m_isEnabled = TRUE; - m_needParent = TRUE; + wxASSERT_MSG( m_isWindow, "Init() must have been called before!" ); PreCreation( parent, id, pos, size, style, name ); @@ -1425,7 +1433,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, #ifdef NEW_GTK_SCROLL_CODE gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW(m_widget), m_wxwindow ); - GtkViewport *viewport = GTK_VIEWPORT(s_window->child); + GtkViewport *viewport = GTK_VIEWPORT( GTK_BIN(s_window)->child ); #else gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow ); GtkViewport *viewport = GTK_VIEWPORT(s_window->viewport); @@ -1526,29 +1534,30 @@ 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 - wxDELETE(m_dropTarget); + if (m_dropTarget) + { + delete m_dropTarget; + m_dropTarget = (wxDropTarget*) NULL; + } #endif #if wxUSE_TOOLTIPS - wxDELETE(m_toolTip); + if (m_toolTip) + { + delete m_toolTip; + m_toolTip = (wxToolTip*) NULL; + } #endif // wxUSE_TOOLTIPS - if (m_parent) m_parent->RemoveChild( this ); if (m_widget) Show( FALSE ); DestroyChildren(); + if (m_parent) m_parent->RemoveChild( this ); + if (m_widgetStyle) gtk_style_unref( m_widgetStyle ); if (m_scrollGC) gdk_gc_unref( m_scrollGC ); @@ -1562,28 +1571,29 @@ wxWindow::~wxWindow() DeleteRelatedConstraints(); if (m_constraints) { - // This removes any dangling pointers to this window - // in other windows' constraintsInvolvedIn lists. + /* This removes any dangling pointers to this window + * in other windows' constraintsInvolvedIn lists. */ UnsetConstraints(m_constraints); delete m_constraints; m_constraints = (wxLayoutConstraints *) NULL; } + if (m_windowSizer) { delete m_windowSizer; m_windowSizer = (wxSizer *) NULL; } - // If this is a child of a sizer, remove self from parent + /* If this is a child of a sizer, remove self from parent */ if (m_sizerParent) m_sizerParent->RemoveChild((wxWindow *)this); - // Just in case the window has been Closed, but - // we're then deleting immediately: don't leave - // dangling pointers. + /* Just in case the window has been Closed, but + * we're then deleting immediately: don't leave + * dangling pointers. */ wxPendingDelete.DeleteObject(this); - // Just in case we've loaded a top-level window via - // wxWindow::LoadNativeDialog but we weren't a dialog - // class + /* Just in case we've loaded a top-level window via + * wxWindow::LoadNativeDialog but we weren't a dialog + * class */ wxTopLevelWindows.DeleteObject(this); if (m_windowValidator) delete m_windowValidator; @@ -1611,7 +1621,7 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, m_x = (int)pos.x; m_y = (int)pos.y; - if (!m_needParent) // some reasonable defaults + if (!m_needParent) /* some reasonable defaults */ { if (m_x == -1) { @@ -1681,6 +1691,8 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, void wxWindow::PostCreation() { + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + if (m_wxwindow) { gtk_signal_connect( GTK_OBJECT(m_wxwindow), "expose_event", @@ -1692,7 +1704,8 @@ void wxWindow::PostCreation() ConnectWidget( GetConnectWidget() ); - if (m_widget && m_parent) gtk_widget_realize( m_widget ); + /* we force the creation of wxFrame and wxDialog in the respective code */ + if (m_parent) gtk_widget_realize( m_widget ); if (m_wxwindow) gtk_widget_realize( m_wxwindow ); @@ -1744,8 +1757,8 @@ bool wxWindow::Close( bool force ) event.SetEventObject(this); event.SetCanVeto(!force); - // return FALSE if window wasn't closed because the application vetoed the - // close event + /* return FALSE if window wasn't closed because the application vetoed the + * close event */ return GetEventHandler()->ProcessEvent(event) && !event.GetVeto(); } @@ -1793,17 +1806,17 @@ void wxWindow::AdjustForParentClientOrigin( int& x, int& y, int sizeFlags ) } } -void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags ) +void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags ) { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); wxASSERT_MSG( (m_parent != NULL), "wxWindow::SetSize requires parent.\n" ); - if (m_resizing) return; // I don't like recursions + if (m_resizing) return; /* I don't like recursions */ m_resizing = TRUE; - if (m_parent->m_wxwindow == NULL) // i.e. wxNotebook + if (m_parent->m_wxwindow == NULL) /* i.e. wxNotebook */ { - // don't set the size for children of wxNotebook, just take the values. + /* don't set the size for children of wxNotebook, just take the values. */ m_x = x; m_y = y; m_width = width; @@ -1878,16 +1891,6 @@ void wxWindow::OnInternalIdle() UpdateWindowUI(); } -void wxWindow::SetSize( int width, int height ) -{ - SetSize( -1, -1, width, height, wxSIZE_USE_EXISTING ); -} - -void wxWindow::Move( int x, int y ) -{ - SetSize( x, y, -1, -1, wxSIZE_USE_EXISTING ); -} - void wxWindow::GetSize( int *width, int *height ) const { wxCHECK_RET( (m_widget != NULL), "invalid window" ); @@ -1896,7 +1899,7 @@ void wxWindow::GetSize( int *width, int *height ) const if (height) (*height) = m_height; } -void wxWindow::SetClientSize( int width, int height ) +void wxWindow::DoSetClientSize( int width, int height ) { wxCHECK_RET( (m_widget != NULL), "invalid window" ); @@ -1926,7 +1929,7 @@ void wxWindow::SetClientSize( int width, int height ) GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); #ifdef NEW_GTK_SCROLL_CODE - GtkWidget *viewport = scroll_window->child; + GtkWidget *viewport = GTK_BIN(scroll_window)->child; #else GtkWidget *viewport = scroll_window->viewport; #endif @@ -1991,7 +1994,7 @@ void wxWindow::GetClientSize( int *width, int *height ) const GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); #ifdef NEW_GTK_SCROLL_CODE - GtkWidget *viewport = scroll_window->child; + GtkWidget *viewport = GTK_BIN(scroll_window)->child; #else GtkWidget *viewport = scroll_window->viewport; #endif @@ -2160,6 +2163,8 @@ bool wxWindow::Show( bool show ) { wxCHECK_MSG( (m_widget != NULL), FALSE, "invalid window" ); + if (show == m_isShown) return TRUE; + if (show) gtk_widget_show( m_widget ); else @@ -2742,7 +2747,7 @@ void wxWindow::InitDialog() static void SetInvokingWindow( wxMenu *menu, wxWindow *win ) { menu->SetInvokingWindow( win ); - wxNode *node = menu->m_items.First(); + wxNode *node = menu->GetItems().First(); while (node) { wxMenuItem *menuitem = (wxMenuItem*)node->Data(); @@ -2829,7 +2834,9 @@ bool wxWindow::IsOwnGtkWindow( GdkWindow *window ) void wxWindow::SetFont( const wxFont &font ) { wxCHECK_RET( m_widget != NULL, "invalid window" ); - + + if (m_font == font) return; + if (((wxFont*)&font)->Ok()) m_font = font; else