X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/47d67540a017101b3e46abe9ef0f55914d8de37e..42c5812dbf723b1cd075fbc6d8cef1dd17df717b:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index a76a068ebd..f220749ead 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -2,9 +2,8 @@ // Name: window.cpp // Purpose: // Author: Robert Roebling -// Created: 01/02/97 -// Id: -// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem +// Id: $id$ +// Copyright: (c) 1998 Robert Roebling, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -914,6 +913,7 @@ wxWindow::wxWindow() m_pDropTarget = (wxDropTarget *) NULL; m_resizing = FALSE; m_hasOwnStyle = FALSE; + m_scrollGC = (GdkGC*) NULL; } bool wxWindow::Create( wxWindow *parent, wxWindowID id, @@ -983,7 +983,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, m_wxwindow = gtk_myfixed_new(); - if (m_wxwindow) GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); + GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); if (m_windowStyle & wxTAB_TRAVERSAL == wxTAB_TRAVERSAL) GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); @@ -1015,13 +1015,13 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, gtk_widget_show( m_wxwindow ); PostCreation(); - + Show( TRUE ); return TRUE; } -wxWindow::~wxWindow(void) +wxWindow::~wxWindow() { m_hasVMT = FALSE; @@ -1032,6 +1032,8 @@ wxWindow::~wxWindow(void) DestroyChildren(); + if (m_scrollGC) gdk_gc_unref( m_scrollGC ); + if (m_wxwindow) gtk_widget_destroy( m_wxwindow ); if (m_widget) gtk_widget_destroy( m_widget ); @@ -1096,7 +1098,7 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, if (m_cursor == NULL) m_cursor = new wxCursor( wxCURSOR_ARROW ); m_font = *wxSWISS_FONT; - m_backgroundColour = wxWHITE; +// m_backgroundColour = wxWHITE; m_foregroundColour = wxBLACK; m_windowStyle = style; m_windowName = name; @@ -1113,7 +1115,7 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, m_hasOwnStyle = FALSE; } -void wxWindow::PostCreation(void) +void wxWindow::PostCreation() { if (m_parent) m_parent->AddChild( this ); @@ -1130,11 +1132,7 @@ void wxWindow::PostCreation(void) if (m_widget && m_parent) gtk_widget_realize( m_widget ); - if (m_wxwindow) - { - gtk_widget_realize( m_wxwindow ); - gdk_gc_set_exposures( m_wxwindow->style->fg_gc[0], TRUE ); - } + if (m_wxwindow) gtk_widget_realize( m_wxwindow ); SetCursor( *wxSTANDARD_CURSOR ); @@ -1168,7 +1166,7 @@ void wxWindow::ConnectWidget( GtkWidget *widget ) GTK_SIGNAL_FUNC(gtk_window_leave_callback), (gpointer)this ); } -bool wxWindow::HasVMT(void) +bool wxWindow::HasVMT() { return m_hasVMT; } @@ -1184,7 +1182,7 @@ bool wxWindow::Close( bool force ) return GetEventHandler()->ProcessEvent(event); } -bool wxWindow::Destroy(void) +bool wxWindow::Destroy() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -1193,7 +1191,7 @@ bool wxWindow::Destroy(void) return TRUE; } -bool wxWindow::DestroyChildren(void) +bool wxWindow::DestroyChildren() { if (GetChildren()) { @@ -1216,7 +1214,7 @@ void wxWindow::PrepareDC( wxDC &WXUNUSED(dc) ) // are we to set fonts here ? } -void wxWindow::ImplementSetSize(void) +void wxWindow::ImplementSetSize() { if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; @@ -1225,7 +1223,7 @@ void wxWindow::ImplementSetSize(void) gtk_widget_set_usize( m_widget, m_width, m_height ); } -void wxWindow::ImplementSetPosition(void) +void wxWindow::ImplementSetPosition() { if (IS_KIND_OF(this,wxFrame) || IS_KIND_OF(this,wxDialog)) { @@ -1523,7 +1521,7 @@ void wxWindow::Centre( int direction ) } } -void wxWindow::Fit(void) +void wxWindow::Fit() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -1582,7 +1580,7 @@ void wxWindow::Enable( bool enable ) if (m_wxwindow) gtk_widget_set_sensitive( m_wxwindow, enable ); } -int wxWindow::GetCharHeight(void) const +int wxWindow::GetCharHeight() const { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -1596,7 +1594,7 @@ int wxWindow::GetCharHeight(void) const return font->ascent + font->descent; } -int wxWindow::GetCharWidth(void) const +int wxWindow::GetCharWidth() const { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -1650,7 +1648,7 @@ void wxWindow::MakeModal( bool modal ) } } -void wxWindow::SetFocus(void) +void wxWindow::SetFocus() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -1664,7 +1662,7 @@ void wxWindow::SetFocus(void) } } -bool wxWindow::OnClose(void) +bool wxWindow::OnClose() { return TRUE; } @@ -1740,7 +1738,7 @@ void wxWindow::AddChild( wxWindow *child ) gtk_widget_set_usize( child->m_widget, child->m_width, child->m_height ); } -wxList *wxWindow::GetChildren(void) +wxList *wxWindow::GetChildren() { return (&m_children); } @@ -1757,26 +1755,26 @@ void wxWindow::SetReturnCode( int retCode ) m_retCode = retCode; } -int wxWindow::GetReturnCode(void) +int wxWindow::GetReturnCode() { return m_retCode; } -void wxWindow::Raise(void) +void wxWindow::Raise() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); if (m_widget) gdk_window_raise( m_widget->window ); } -void wxWindow::Lower(void) +void wxWindow::Lower() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); if (m_widget) gdk_window_lower( m_widget->window ); } -wxEvtHandler *wxWindow::GetEventHandler(void) +wxEvtHandler *wxWindow::GetEventHandler() { return m_eventHandler; } @@ -1812,7 +1810,7 @@ wxEvtHandler *wxWindow::PopEventHandler(bool deleteHandler) return (wxEvtHandler *) NULL; } -wxValidator *wxWindow::GetValidator(void) +wxValidator *wxWindow::GetValidator() { return m_windowValidator; } @@ -1824,7 +1822,7 @@ void wxWindow::SetValidator( const wxValidator& validator ) if (m_windowValidator) m_windowValidator->SetWindow(this); } -bool wxWindow::IsBeingDeleted(void) +bool wxWindow::IsBeingDeleted() { return FALSE; } @@ -1834,7 +1832,7 @@ void wxWindow::SetId( wxWindowID id ) m_windowId = id; } -wxWindowID wxWindow::GetId(void) +wxWindowID wxWindow::GetId() { return m_windowId; } @@ -1937,33 +1935,38 @@ bool wxWindow::IsExposed( const wxRect& rect ) const return (m_updateRegion.Contains( rect.x, rect.y, rect.width, rect.height ) != wxOutRegion ); } -void wxWindow::Clear(void) +void wxWindow::Clear() { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxCHECK_RET( m_widget != NULL, "invalid window" ); if (m_wxwindow && m_wxwindow->window) gdk_window_clear( m_wxwindow->window ); } -wxColour wxWindow::GetBackgroundColour(void) const +wxColour wxWindow::GetBackgroundColour() const { return m_backgroundColour; } +void wxWindow::SetBackgroundColourHelper( GdkWindow *window ) +{ + if (!m_backgroundColour.Ok()) return; + + m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); + gdk_window_set_background( window, m_backgroundColour.GetColor() ); + gdk_window_clear( window ); +} + void wxWindow::SetBackgroundColour( const wxColour &colour ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxCHECK_RET( m_widget != NULL, "invalid window" ); m_backgroundColour = colour; - if (m_wxwindow) - { - m_backgroundColour.CalcPixel( m_wxwindow->style->colormap ); - gdk_window_set_background( m_wxwindow->window, m_backgroundColour.GetColor() ); - gdk_window_clear( m_wxwindow->window ); - } - // do something ? + + GtkWidget *widget = m_wxwindow == NULL ? m_widget : m_wxwindow; + SetBackgroundColourHelper( widget->window ); } -wxColour wxWindow::GetForegroundColour(void) const +wxColour wxWindow::GetForegroundColour() const { return m_foregroundColour; } @@ -1973,9 +1976,9 @@ void wxWindow::SetForegroundColour( const wxColour &colour ) m_foregroundColour = colour; } -bool wxWindow::Validate(void) +bool wxWindow::Validate() { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxCHECK_MSG( m_widget != NULL, FALSE, "invalid window" ); wxNode *node = GetChildren()->First(); while (node) @@ -1988,9 +1991,9 @@ bool wxWindow::Validate(void) return TRUE; } -bool wxWindow::TransferDataToWindow(void) +bool wxWindow::TransferDataToWindow() { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxCHECK_MSG( m_widget != NULL, FALSE, "invalid window" ); wxNode *node = GetChildren()->First(); while (node) @@ -2007,7 +2010,7 @@ bool wxWindow::TransferDataToWindow(void) return TRUE; } -bool wxWindow::TransferDataFromWindow(void) +bool wxWindow::TransferDataFromWindow() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -2032,7 +2035,7 @@ void wxWindow::OnInitDialog( wxInitDialogEvent &WXUNUSED(event) ) TransferDataToWindow(); } -void wxWindow::InitDialog(void) +void wxWindow::InitDialog() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -2110,7 +2113,7 @@ void wxWindow::DisconnectDnDWidget( GtkWidget *widget ) m_pDropTarget->UnregisterWidget( widget ); } -GtkWidget* wxWindow::GetConnectWidget(void) +GtkWidget* wxWindow::GetConnectWidget() { GtkWidget *connect_widget = m_widget; if (m_wxwindow) connect_widget = m_wxwindow; @@ -2150,7 +2153,7 @@ void wxWindow::SetFont( const wxFont &font ) gtk_widget_set_style( m_widget, style ); } -wxFont *wxWindow::GetFont(void) +wxFont *wxWindow::GetFont() { return &m_font; } @@ -2160,12 +2163,12 @@ void wxWindow::SetWindowStyleFlag( long flag ) m_windowStyle = flag; } -long wxWindow::GetWindowStyleFlag(void) const +long wxWindow::GetWindowStyleFlag() const { return m_windowStyle; } -void wxWindow::CaptureMouse(void) +void wxWindow::CaptureMouse() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -2182,7 +2185,7 @@ void wxWindow::CaptureMouse(void) g_capturing = TRUE; } -void wxWindow::ReleaseMouse(void) +void wxWindow::ReleaseMouse() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); @@ -2198,12 +2201,12 @@ void wxWindow::SetTitle( const wxString &WXUNUSED(title) ) { } -wxString wxWindow::GetTitle(void) const +wxString wxWindow::GetTitle() const { return (wxString&)m_windowName; } -wxString wxWindow::GetLabel(void) const +wxString wxWindow::GetLabel() const { return GetTitle(); } @@ -2213,17 +2216,17 @@ void wxWindow::SetName( const wxString &name ) m_windowName = name; } -wxString wxWindow::GetName(void) const +wxString wxWindow::GetName() const { return (wxString&)m_windowName; } -bool wxWindow::IsShown(void) const +bool wxWindow::IsShown() const { return m_isShown; } -bool wxWindow::IsRetained(void) +bool wxWindow::IsRetained() { return FALSE; } @@ -2426,7 +2429,14 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) int d_y = 0; if (dx > 0) d_x = dx; if (dy > 0) d_y = dy; - gdk_window_copy_area( m_wxwindow->window, m_wxwindow->style->fg_gc[0], d_x, d_y, + + if (!m_scrollGC) + { + m_scrollGC = gdk_gc_new( m_wxwindow->window ); + gdk_gc_set_exposures( m_scrollGC, TRUE ); + } + + gdk_window_copy_area( m_wxwindow->window, m_scrollGC, d_x, d_y, m_wxwindow->window, s_x, s_y, w, h ); wxRect rect; @@ -2442,7 +2452,7 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) // Layout //------------------------------------------------------------------------------------- -wxLayoutConstraints *wxWindow::GetConstraints(void) const +wxLayoutConstraints *wxWindow::GetConstraints() const { return m_constraints; } @@ -2484,12 +2494,12 @@ void wxWindow::SetAutoLayout( bool autoLayout ) m_autoLayout = autoLayout; } -bool wxWindow::GetAutoLayout(void) const +bool wxWindow::GetAutoLayout() const { return m_autoLayout; } -wxSizer *wxWindow::GetSizer(void) const +wxSizer *wxWindow::GetSizer() const { return m_windowSizer; } @@ -2499,7 +2509,7 @@ void wxWindow::SetSizerParent( wxWindow *win ) m_sizerParent = win; } -wxWindow *wxWindow::GetSizerParent(void) const +wxWindow *wxWindow::GetSizerParent() const { return m_sizerParent; } @@ -2547,7 +2557,7 @@ void wxWindow::RemoveConstraintReference(wxWindow *otherWin) } // Reset any constraints that mention this window -void wxWindow::DeleteRelatedConstraints(void) +void wxWindow::DeleteRelatedConstraints() { if (m_constraintsInvolvedIn) { @@ -2589,7 +2599,7 @@ void wxWindow::SetSizer(wxSizer *sizer) * New version */ -bool wxWindow::Layout(void) +bool wxWindow::Layout() { if (GetConstraints()) { @@ -2689,7 +2699,7 @@ bool wxWindow::DoPhase(int phase) return TRUE; } -void wxWindow::ResetConstraints(void) +void wxWindow::ResetConstraints() { wxLayoutConstraints *constr = GetConstraints(); if (constr)