From c89f5c02b1ecc6098b21b39b01509dd387c1cb34 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 4 Feb 2002 18:01:21 +0000 Subject: [PATCH] Added missing test in wxObject::Ref() for already equal objects (same m_refData). Implemented new ref counting for wxBrush, wxPen and wxColour (in addition to wxRegion). Also inlined some more functions and implemented real comparisons. Corrected refresh code to update GTK's window-less widgets if overdrawn after a wxWindow::Refresh(). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13999 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/gtk/changes.txt | 28 ++++++-- include/wx/gtk/brush.h | 20 ++++-- include/wx/gtk/colour.h | 91 +++++++++++++------------ include/wx/gtk/pen.h | 21 +++--- include/wx/gtk/region.h | 10 +-- include/wx/gtk1/brush.h | 20 ++++-- include/wx/gtk1/colour.h | 91 +++++++++++++------------ include/wx/gtk1/pen.h | 21 +++--- include/wx/gtk1/region.h | 10 +-- src/common/object.cpp | 4 ++ src/gtk/brush.cpp | 100 +++++++++++---------------- src/gtk/colour.cpp | 78 +++++++++------------ src/gtk/pen.cpp | 144 ++++++++++++++++++--------------------- src/gtk/region.cpp | 10 +-- src/gtk/window.cpp | 57 +++++++++------- src/gtk1/brush.cpp | 100 +++++++++++---------------- src/gtk1/colour.cpp | 78 +++++++++------------ src/gtk1/pen.cpp | 144 ++++++++++++++++++--------------------- src/gtk1/region.cpp | 10 +-- src/gtk1/window.cpp | 57 +++++++++------- 20 files changed, 534 insertions(+), 560 deletions(-) diff --git a/docs/gtk/changes.txt b/docs/gtk/changes.txt index 2b5a91ff5b..f70807fd93 100644 --- a/docs/gtk/changes.txt +++ b/docs/gtk/changes.txt @@ -1,11 +1,29 @@ *** wxWindows 2.3.3 *** +Implemented new ref-counting for GDI classes. + +New implemenation of wxCondition. + +Implemented actual comparisons between GDI classes instead of +comparing just the ref-count. + +Fixed wxMiniFrame again. + +Added wxCursor creation from wxImage. + +Added inlined wxHashMap class. + +Redone thread wake-up code for immediate wake-up instead +of 50 ms pause. This gives apps 100% CPU time for background +tasks. + New behaviour for wxWindow::Refresh() as it now produces a delayed refresh. Call the new wxWindow::Update() to force an immediate update. -Support for more SGI hardware (12-bit mode among others). +Support for more SGI hardware (12-bit mode among others) and +corrections to wxImage code for special SGI visuals. Changed wxDC::Blit() to honour source DC's logical coordinates. @@ -14,16 +32,14 @@ tasks (unlike thread work). Various updates to wxHTML. -Some wxFont changes for better mixing of native fonts -and wxFont's accessors. - -Corrections to wxImage code for special SGI visuals. +Some wxFont changes for better mixing of native fonts and +wxFont's accessors. Added IFF image handler. Added ICO, CUR and ANI image handler. -wxFrame::SetMenuBar() works again. +wxFrame::SetMenuBar() corrected. wxButton honours wxBU_EXACTFIT. diff --git a/include/wx/gtk/brush.h b/include/wx/gtk/brush.h index 31d4b7292c..2859c6ad39 100644 --- a/include/wx/gtk/brush.h +++ b/include/wx/gtk/brush.h @@ -34,15 +34,19 @@ class wxBrush; class wxBrush: public wxGDIObject { public: - wxBrush(); + wxBrush() { } + wxBrush( const wxColour &colour, int style ); wxBrush( const wxBitmap &stippleBitmap ); - wxBrush( const wxBrush &brush ); ~wxBrush(); - wxBrush& operator = ( const wxBrush& brush ); + + wxBrush( const wxBrush &brush ) { Ref(brush); } + wxBrush& operator = ( const wxBrush& brush ) { Ref(brush); return *this; } + + bool Ok() const { return m_refData != NULL; } + bool operator == ( const wxBrush& brush ) const; - bool operator != ( const wxBrush& brush ) const; - bool Ok() const; + bool operator != (const wxBrush& brush) const { return !(*this == brush); } int GetStyle() const; wxColour &GetColour() const; @@ -53,9 +57,11 @@ public: void SetStyle( int style ); void SetStipple( const wxBitmap& stipple ); - void Unshare(); - private: + // ref counting code + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + DECLARE_DYNAMIC_CLASS(wxBrush) }; diff --git a/include/wx/gtk/colour.h b/include/wx/gtk/colour.h index 8d27d3f3b2..bce0560ddb 100644 --- a/include/wx/gtk/colour.h +++ b/include/wx/gtk/colour.h @@ -39,55 +39,56 @@ class wxColour; class wxColour: public wxGDIObject { public: - // ctors - // default - wxColour(); - // from RGB - wxColour( unsigned char red, unsigned char green, unsigned char blue ); - wxColour( unsigned long colRGB ) { Set(colRGB); } - - // implicit conversion from the colour name - wxColour( const wxString &colourName ) { InitFromName(colourName); } - wxColour( const char *colourName ) { InitFromName(colourName); } - - // copy ctors and assignment operators - wxColour( const wxColour& col ); - wxColour& operator = ( const wxColour& col ); - - // dtor - ~wxColour(); - - // comparison - bool operator == ( const wxColour& col ) const; - bool operator != ( const wxColour& col ) const; - - // accessors - void Set( unsigned char red, unsigned char green, unsigned char blue ); - void Set( unsigned long colRGB ) - { - // we don't need to know sizeof(long) here because we assume that the three - // least significant bytes contain the R, G and B values - Set((unsigned char)colRGB, - (unsigned char)(colRGB >> 8), - (unsigned char)(colRGB >> 16)); - } - - unsigned char Red() const; - unsigned char Green() const; - unsigned char Blue() const; - bool Ok() const; - - // implementation - void CalcPixel( GdkColormap *cmap ); - int GetPixel() const; - GdkColor *GetColor() const; + wxColour() { } + + // Construct from RGB + wxColour( unsigned char red, unsigned char green, unsigned char blue ); + wxColour( unsigned long colRGB ) { Set(colRGB); } + + // Implicit conversion from the colour name + wxColour( const wxString &colourName ) { InitFromName(colourName); } + wxColour( const char *colourName ) { InitFromName(colourName); } + + wxColour( const wxColour& col ) { Ref(col); } + wxColour& operator = ( const wxColour& col ) { Ref(col); return *this; } + + ~wxColour(); + + bool Ok() const { return m_refData != NULL; } + + bool operator == ( const wxColour& col ) const; + bool operator != ( const wxColour& col ) const { return !(*this == col); } + + void Set( unsigned char red, unsigned char green, unsigned char blue ); + void Set( unsigned long colRGB ) + { + // We don't need to know sizeof(long) here because we assume that the three + // least significant bytes contain the R, G and B values + Set((unsigned char)colRGB, + (unsigned char)(colRGB >> 8), + (unsigned char)(colRGB >> 16)); + } + + unsigned char Red() const; + unsigned char Green() const; + unsigned char Blue() const; + + + // Implementation part + void CalcPixel( GdkColormap *cmap ); + int GetPixel() const; + GdkColor *GetColor() const; protected: - // helper functions - void InitFromName(const wxString& colourName); + // ref counting code + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + // Helper functions + void InitFromName(const wxString& colourName); private: - DECLARE_DYNAMIC_CLASS(wxColour) + DECLARE_DYNAMIC_CLASS(wxColour) }; #endif // __GTKCOLOURH__ diff --git a/include/wx/gtk/pen.h b/include/wx/gtk/pen.h index 20d09c2ed4..cf1464fdb1 100644 --- a/include/wx/gtk/pen.h +++ b/include/wx/gtk/pen.h @@ -40,13 +40,18 @@ typedef gchar wxGTKDash; class wxPen: public wxGDIObject { public: - wxPen(); + wxPen() { } + wxPen( const wxColour &colour, int width, int style ); - wxPen( const wxPen& pen ); ~wxPen(); - wxPen& operator = ( const wxPen& pen ); + + wxPen( const wxPen& pen ) { Ref(pen); } + wxPen& operator = ( const wxPen& pen ) { Ref(pen); return *this; } + + bool Ok() const { return m_refData != NULL; } + bool operator == ( const wxPen& pen ) const; - bool operator != ( const wxPen& pen ) const; + bool operator != (const wxPen& pen) const { return !(*this == pen); } void SetColour( const wxColour &colour ); void SetColour( int red, int green, int blue ); @@ -64,12 +69,12 @@ public: int GetDashes(wxDash **ptr) const; int GetDashCount() const; wxDash* GetDash() const; - - bool Ok() const; - - void Unshare(); private: + // ref counting code + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + DECLARE_DYNAMIC_CLASS(wxPen) }; diff --git a/include/wx/gtk/region.h b/include/wx/gtk/region.h index b7fd0acf9e..c4f58a97d7 100644 --- a/include/wx/gtk/region.h +++ b/include/wx/gtk/region.h @@ -71,13 +71,15 @@ public: } wxRegion( size_t n, const wxPoint *points, int fillStyle = wxODDEVEN_RULE ); - virtual ~wxRegion(); + ~wxRegion(); - wxRegion( const wxRegion& r ) { Ref(r); } - wxRegion& operator = ( const wxRegion& r ) { Ref(r); return *this; } + wxRegion( const wxRegion& region ) { Ref(region); } + wxRegion& operator = ( const wxRegion& region ) { Ref(region); return *this; } + + bool Ok() const { return m_refData != NULL; } bool operator == ( const wxRegion& region ); - bool operator != ( const wxRegion& region ); + bool operator != ( const wxRegion& region ) { return !(*this == region); } void Clear(); diff --git a/include/wx/gtk1/brush.h b/include/wx/gtk1/brush.h index 31d4b7292c..2859c6ad39 100644 --- a/include/wx/gtk1/brush.h +++ b/include/wx/gtk1/brush.h @@ -34,15 +34,19 @@ class wxBrush; class wxBrush: public wxGDIObject { public: - wxBrush(); + wxBrush() { } + wxBrush( const wxColour &colour, int style ); wxBrush( const wxBitmap &stippleBitmap ); - wxBrush( const wxBrush &brush ); ~wxBrush(); - wxBrush& operator = ( const wxBrush& brush ); + + wxBrush( const wxBrush &brush ) { Ref(brush); } + wxBrush& operator = ( const wxBrush& brush ) { Ref(brush); return *this; } + + bool Ok() const { return m_refData != NULL; } + bool operator == ( const wxBrush& brush ) const; - bool operator != ( const wxBrush& brush ) const; - bool Ok() const; + bool operator != (const wxBrush& brush) const { return !(*this == brush); } int GetStyle() const; wxColour &GetColour() const; @@ -53,9 +57,11 @@ public: void SetStyle( int style ); void SetStipple( const wxBitmap& stipple ); - void Unshare(); - private: + // ref counting code + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + DECLARE_DYNAMIC_CLASS(wxBrush) }; diff --git a/include/wx/gtk1/colour.h b/include/wx/gtk1/colour.h index 8d27d3f3b2..bce0560ddb 100644 --- a/include/wx/gtk1/colour.h +++ b/include/wx/gtk1/colour.h @@ -39,55 +39,56 @@ class wxColour; class wxColour: public wxGDIObject { public: - // ctors - // default - wxColour(); - // from RGB - wxColour( unsigned char red, unsigned char green, unsigned char blue ); - wxColour( unsigned long colRGB ) { Set(colRGB); } - - // implicit conversion from the colour name - wxColour( const wxString &colourName ) { InitFromName(colourName); } - wxColour( const char *colourName ) { InitFromName(colourName); } - - // copy ctors and assignment operators - wxColour( const wxColour& col ); - wxColour& operator = ( const wxColour& col ); - - // dtor - ~wxColour(); - - // comparison - bool operator == ( const wxColour& col ) const; - bool operator != ( const wxColour& col ) const; - - // accessors - void Set( unsigned char red, unsigned char green, unsigned char blue ); - void Set( unsigned long colRGB ) - { - // we don't need to know sizeof(long) here because we assume that the three - // least significant bytes contain the R, G and B values - Set((unsigned char)colRGB, - (unsigned char)(colRGB >> 8), - (unsigned char)(colRGB >> 16)); - } - - unsigned char Red() const; - unsigned char Green() const; - unsigned char Blue() const; - bool Ok() const; - - // implementation - void CalcPixel( GdkColormap *cmap ); - int GetPixel() const; - GdkColor *GetColor() const; + wxColour() { } + + // Construct from RGB + wxColour( unsigned char red, unsigned char green, unsigned char blue ); + wxColour( unsigned long colRGB ) { Set(colRGB); } + + // Implicit conversion from the colour name + wxColour( const wxString &colourName ) { InitFromName(colourName); } + wxColour( const char *colourName ) { InitFromName(colourName); } + + wxColour( const wxColour& col ) { Ref(col); } + wxColour& operator = ( const wxColour& col ) { Ref(col); return *this; } + + ~wxColour(); + + bool Ok() const { return m_refData != NULL; } + + bool operator == ( const wxColour& col ) const; + bool operator != ( const wxColour& col ) const { return !(*this == col); } + + void Set( unsigned char red, unsigned char green, unsigned char blue ); + void Set( unsigned long colRGB ) + { + // We don't need to know sizeof(long) here because we assume that the three + // least significant bytes contain the R, G and B values + Set((unsigned char)colRGB, + (unsigned char)(colRGB >> 8), + (unsigned char)(colRGB >> 16)); + } + + unsigned char Red() const; + unsigned char Green() const; + unsigned char Blue() const; + + + // Implementation part + void CalcPixel( GdkColormap *cmap ); + int GetPixel() const; + GdkColor *GetColor() const; protected: - // helper functions - void InitFromName(const wxString& colourName); + // ref counting code + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + + // Helper functions + void InitFromName(const wxString& colourName); private: - DECLARE_DYNAMIC_CLASS(wxColour) + DECLARE_DYNAMIC_CLASS(wxColour) }; #endif // __GTKCOLOURH__ diff --git a/include/wx/gtk1/pen.h b/include/wx/gtk1/pen.h index 20d09c2ed4..cf1464fdb1 100644 --- a/include/wx/gtk1/pen.h +++ b/include/wx/gtk1/pen.h @@ -40,13 +40,18 @@ typedef gchar wxGTKDash; class wxPen: public wxGDIObject { public: - wxPen(); + wxPen() { } + wxPen( const wxColour &colour, int width, int style ); - wxPen( const wxPen& pen ); ~wxPen(); - wxPen& operator = ( const wxPen& pen ); + + wxPen( const wxPen& pen ) { Ref(pen); } + wxPen& operator = ( const wxPen& pen ) { Ref(pen); return *this; } + + bool Ok() const { return m_refData != NULL; } + bool operator == ( const wxPen& pen ) const; - bool operator != ( const wxPen& pen ) const; + bool operator != (const wxPen& pen) const { return !(*this == pen); } void SetColour( const wxColour &colour ); void SetColour( int red, int green, int blue ); @@ -64,12 +69,12 @@ public: int GetDashes(wxDash **ptr) const; int GetDashCount() const; wxDash* GetDash() const; - - bool Ok() const; - - void Unshare(); private: + // ref counting code + virtual wxObjectRefData *CreateRefData() const; + virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; + DECLARE_DYNAMIC_CLASS(wxPen) }; diff --git a/include/wx/gtk1/region.h b/include/wx/gtk1/region.h index b7fd0acf9e..c4f58a97d7 100644 --- a/include/wx/gtk1/region.h +++ b/include/wx/gtk1/region.h @@ -71,13 +71,15 @@ public: } wxRegion( size_t n, const wxPoint *points, int fillStyle = wxODDEVEN_RULE ); - virtual ~wxRegion(); + ~wxRegion(); - wxRegion( const wxRegion& r ) { Ref(r); } - wxRegion& operator = ( const wxRegion& r ) { Ref(r); return *this; } + wxRegion( const wxRegion& region ) { Ref(region); } + wxRegion& operator = ( const wxRegion& region ) { Ref(region); return *this; } + + bool Ok() const { return m_refData != NULL; } bool operator == ( const wxRegion& region ); - bool operator != ( const wxRegion& region ); + bool operator != ( const wxRegion& region ) { return !(*this == region); } void Clear(); diff --git a/src/common/object.cpp b/src/common/object.cpp index 1fe178f04f..01047a1f73 100644 --- a/src/common/object.cpp +++ b/src/common/object.cpp @@ -230,6 +230,10 @@ void wxObject::Ref(const wxObject& clone) DEBUG_PRINTF(wxObject::Ref) #endif + // nothing to be done + if (m_refData == clone.m_refData) + return; + // delete reference to old data UnRef(); diff --git a/src/gtk/brush.cpp b/src/gtk/brush.cpp index 68d4d985f9..c6b35cc4a2 100644 --- a/src/gtk/brush.cpp +++ b/src/gtk/brush.cpp @@ -22,36 +22,36 @@ class wxBrushRefData: public wxObjectRefData { public: - wxBrushRefData(); - wxBrushRefData( const wxBrushRefData& data ); - - int m_style; - wxBitmap m_stipple; - wxColour m_colour; + wxBrushRefData() + { + m_style = 0; + } + + wxBrushRefData( const wxBrushRefData& data ) + { + m_style = data.m_style; + m_stipple = data.m_stipple; + m_colour = data.m_colour; + } + + bool operator == (const wxBrushRefData& data) const + { + return (m_style == data.m_style && + m_stipple == data.m_stipple && + m_colour == data.m_colour); + } + + int m_style; + wxColour m_colour; + wxBitmap m_stipple; }; -wxBrushRefData::wxBrushRefData() -{ - m_style = 0; -} - -wxBrushRefData::wxBrushRefData( const wxBrushRefData& data ) -{ - m_style = data.m_style; - m_stipple = data.m_stipple; - m_colour = data.m_colour; -} - //----------------------------------------------------------------------------- #define M_BRUSHDATA ((wxBrushRefData *)m_refData) IMPLEMENT_DYNAMIC_CLASS(wxBrush,wxGDIObject) -wxBrush::wxBrush() -{ -} - wxBrush::wxBrush( const wxColour &colour, int style ) { m_refData = new wxBrushRefData(); @@ -72,36 +72,28 @@ wxBrush::wxBrush( const wxBitmap &stippleBitmap ) M_BRUSHDATA->m_style = wxSTIPPLE; } -wxBrush::wxBrush( const wxBrush &brush ) -{ - Ref( brush ); -} - wxBrush::~wxBrush() { + // m_refData unrefed in ~wxObject } -wxBrush& wxBrush::operator = ( const wxBrush& brush ) -{ - if ( m_refData != brush.m_refData ) - Ref( brush ); - - return *this; -} - -bool wxBrush::operator == ( const wxBrush& brush ) const +wxObjectRefData *wxBrush::CreateRefData() const { - return m_refData == brush.m_refData; + return new wxBrushRefData; } -bool wxBrush::operator != ( const wxBrush& brush ) const +wxObjectRefData *wxBrush::CloneRefData(const wxObjectRefData *data) const { - return m_refData != brush.m_refData; + return new wxBrushRefData(*(wxBrushRefData *)data); } -bool wxBrush::Ok() const +bool wxBrush::operator == ( const wxBrush& brush ) const { - return ((m_refData) && M_BRUSHDATA->m_colour.Ok()); + if (m_refData == brush.m_refData) return TRUE; + + if (!m_refData || !brush.m_refData) return FALSE; + + return ( *(wxBrushRefData*)m_refData == *(wxBrushRefData*)brush.m_refData ); } int wxBrush::GetStyle() const @@ -139,25 +131,29 @@ wxBitmap *wxBrush::GetStipple() const void wxBrush::SetColour( const wxColour& col ) { - Unshare(); + AllocExclusive(); + M_BRUSHDATA->m_colour = col; } void wxBrush::SetColour( unsigned char r, unsigned char g, unsigned char b ) { - Unshare(); + AllocExclusive(); + M_BRUSHDATA->m_colour.Set( r, g, b ); } void wxBrush::SetStyle( int style ) { - Unshare(); + AllocExclusive(); + M_BRUSHDATA->m_style = style; } void wxBrush::SetStipple( const wxBitmap& stipple ) { - Unshare(); + AllocExclusive(); + M_BRUSHDATA->m_stipple = stipple; if (M_BRUSHDATA->m_stipple.GetMask()) { @@ -169,17 +165,3 @@ void wxBrush::SetStipple( const wxBitmap& stipple ) } } -void wxBrush::Unshare() -{ - if (!m_refData) - { - m_refData = new wxBrushRefData(); - } - else - { - wxBrushRefData* ref = new wxBrushRefData( *(wxBrushRefData*)m_refData ); - UnRef(); - m_refData = ref; - } -} - diff --git a/src/gtk/colour.cpp b/src/gtk/colour.cpp index 9ac38bff4b..8ee81076b5 100644 --- a/src/gtk/colour.cpp +++ b/src/gtk/colour.cpp @@ -25,13 +25,34 @@ class wxColourRefData: public wxObjectRefData { public: - wxColourRefData(); - ~wxColourRefData(); + wxColourRefData() + { + m_color.red = 0; + m_color.green = 0; + m_color.blue = 0; + m_color.pixel = 0; + m_colormap = (GdkColormap *) NULL; + m_hasPixel = FALSE; + } + + ~wxColourRefData() + { + FreeColour(); + } + bool operator == (const wxColourRefData& data) const + { + return (m_colormap == data.m_colormap && + m_hasPixel == data.m_hasPixel && + m_color.red == data.m_color.red && + m_color.green == data.m_color.green && + m_color.blue == data.m_color.blue && + m_color.pixel == data.m_color.pixel); + } + void FreeColour(); void AllocColour( GdkColormap* cmap ); -public: GdkColor m_color; GdkColormap *m_colormap; bool m_hasPixel; @@ -59,21 +80,6 @@ gushort wxColourRefData::colMapAllocCounter[ 256 ] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -wxColourRefData::wxColourRefData() -{ - m_color.red = 0; - m_color.green = 0; - m_color.blue = 0; - m_color.pixel = 0; - m_colormap = (GdkColormap *) NULL; - m_hasPixel = FALSE; -} - -wxColourRefData::~wxColourRefData() -{ - FreeColour(); -} - void wxColourRefData::FreeColour() { if (m_colormap) @@ -131,10 +137,6 @@ void wxColourRefData::AllocColour( GdkColormap *cmap ) IMPLEMENT_DYNAMIC_CLASS(wxColour,wxGDIObject) -wxColour::wxColour() -{ -} - wxColour::wxColour( unsigned char red, unsigned char green, unsigned char blue ) { m_refData = new wxColourRefData(); @@ -173,28 +175,15 @@ void wxColour::InitFromName( const wxString &colourName ) } } -wxColour::wxColour( const wxColour& col ) -{ - Ref( col ); -} - wxColour::~wxColour() { } -wxColour& wxColour::operator = ( const wxColour& col ) -{ - if (*this == col) return (*this); - Ref( col ); - return *this; -} - bool wxColour::operator == ( const wxColour& col ) const { if (m_refData == col.m_refData) return TRUE; - if (!m_refData) return FALSE; - if (!col.m_refData) return FALSE; + if (!m_refData || !col.m_refData) return FALSE; GdkColor *own = &(((wxColourRefData*)m_refData)->m_color); GdkColor *other = &(((wxColourRefData*)col.m_refData)->m_color); @@ -205,14 +194,20 @@ bool wxColour::operator == ( const wxColour& col ) const return TRUE; } -bool wxColour::operator != ( const wxColour& col) const +wxObjectRefData *wxColour::CreateRefData() const +{ + return new wxColourRefData; +} + +wxObjectRefData *wxColour::CloneRefData(const wxObjectRefData *data) const { - return !(*this == col); + return new wxColourRefData(*(wxColourRefData *)data); } void wxColour::Set( unsigned char red, unsigned char green, unsigned char blue ) { - UnRef(); + AllocExclusive(); + m_refData = new wxColourRefData(); M_COLDATA->m_color.red = ((unsigned short)red) << SHIFT; M_COLDATA->m_color.green = ((unsigned short)green) << SHIFT; @@ -241,11 +236,6 @@ unsigned char wxColour::Blue() const return (unsigned char)(M_COLDATA->m_color.blue >> SHIFT); } -bool wxColour::Ok() const -{ - return (m_refData != NULL); -} - void wxColour::CalcPixel( GdkColormap *cmap ) { if (!Ok()) return; diff --git a/src/gtk/pen.cpp b/src/gtk/pen.cpp index c398c71b58..7ba9b5940d 100644 --- a/src/gtk/pen.cpp +++ b/src/gtk/pen.cpp @@ -23,43 +23,48 @@ class wxPenRefData: public wxObjectRefData { public: - - wxPenRefData(); - wxPenRefData( const wxPenRefData& data ); - - int m_width; - int m_style; - int m_joinStyle; - int m_capStyle; - wxColour m_colour; - int m_countDashes; - wxGTKDash *m_dash; -}; - -wxPenRefData::wxPenRefData() -{ - m_width = 1; - m_style = wxSOLID; - m_joinStyle = wxJOIN_ROUND; - m_capStyle = wxCAP_ROUND; - m_dash = (wxGTKDash*) NULL; - m_countDashes = 0; -} - -wxPenRefData::wxPenRefData( const wxPenRefData& data ) -{ - m_style = data.m_style; - m_width = data.m_width; - m_joinStyle = data.m_joinStyle; - m_capStyle = data.m_capStyle; - m_colour = data.m_colour; - m_countDashes = data.m_countDashes; + wxPenRefData() + { + m_width = 1; + m_style = wxSOLID; + m_joinStyle = wxJOIN_ROUND; + m_capStyle = wxCAP_ROUND; + m_dash = (wxGTKDash*) NULL; + m_countDashes = 0; + } + + wxPenRefData( const wxPenRefData& data ) + { + m_style = data.m_style; + m_width = data.m_width; + m_joinStyle = data.m_joinStyle; + m_capStyle = data.m_capStyle; + m_colour = data.m_colour; + m_countDashes = data.m_countDashes; /* - if (data.m_dash) TODO - m_dash = new + if (data.m_dash) TODO + m_dash = new */ - m_dash = data.m_dash; -} + m_dash = data.m_dash; + } + + bool operator == (const wxPenRefData& data) const + { + return (m_style == data.m_style && + m_width == data.m_width && + m_joinStyle == data.m_joinStyle && + m_capStyle == data.m_capStyle && + m_colour == data.m_colour); + } + + int m_width; + int m_style; + int m_joinStyle; + int m_capStyle; + wxColour m_colour; + int m_countDashes; + wxGTKDash *m_dash; +}; //----------------------------------------------------------------------------- @@ -67,10 +72,6 @@ wxPenRefData::wxPenRefData( const wxPenRefData& data ) IMPLEMENT_DYNAMIC_CLASS(wxPen,wxGDIObject) -wxPen::wxPen() -{ -} - wxPen::wxPen( const wxColour &colour, int width, int style ) { m_refData = new wxPenRefData(); @@ -79,73 +80,77 @@ wxPen::wxPen( const wxColour &colour, int width, int style ) M_PENDATA->m_colour = colour; } -wxPen::wxPen( const wxPen& pen ) -{ - Ref( pen ); -} - wxPen::~wxPen() { + // m_refData unrefed in ~wxObject } -wxPen& wxPen::operator = ( const wxPen& pen ) +wxObjectRefData *wxPen::CreateRefData() const { - if ( m_refData != pen.m_refData ) - Ref( pen ); - - return *this; + return new wxPenRefData; } -bool wxPen::operator == ( const wxPen& pen ) const +wxObjectRefData *wxPen::CloneRefData(const wxObjectRefData *data) const { - return m_refData == pen.m_refData; + return new wxPenRefData(*(wxPenRefData *)data); } -bool wxPen::operator != ( const wxPen& pen ) const +bool wxPen::operator == ( const wxPen& pen ) const { - return m_refData != pen.m_refData; + if (m_refData == pen.m_refData) return TRUE; + + if (!m_refData || !pen.m_refData) return FALSE; + + return ( *(wxPenRefData*)m_refData == *(wxPenRefData*)pen.m_refData ); } void wxPen::SetColour( const wxColour &colour ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_colour = colour; } void wxPen::SetDashes( int number_of_dashes, const wxDash *dash ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_countDashes = number_of_dashes; M_PENDATA->m_dash = (wxGTKDash *)dash; /* TODO */ } void wxPen::SetColour( int red, int green, int blue ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_colour.Set( red, green, blue ); } void wxPen::SetCap( int capStyle ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_capStyle = capStyle; } void wxPen::SetJoin( int joinStyle ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_joinStyle = joinStyle; } void wxPen::SetStyle( int style ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_style = style; } void wxPen::SetWidth( int width ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_width = width; } @@ -200,22 +205,3 @@ wxColour &wxPen::GetColour() const return M_PENDATA->m_colour; } -bool wxPen::Ok() const -{ - return (m_refData != NULL); -} - -void wxPen::Unshare() -{ - if (!m_refData) - { - m_refData = new wxPenRefData(); - } - else - { - wxPenRefData* ref = new wxPenRefData( *(wxPenRefData*)m_refData ); - UnRef(); - m_refData = ref; - } -} - diff --git a/src/gtk/region.cpp b/src/gtk/region.cpp index 2159fea32e..2e40166981 100644 --- a/src/gtk/region.cpp +++ b/src/gtk/region.cpp @@ -133,22 +133,22 @@ wxObjectRefData *wxRegion::CloneRefData(const wxObjectRefData *data) const { return new wxRegionRefData(*(wxRegionRefData *)data); } + // ---------------------------------------------------------------------------- // wxRegion comparison // ---------------------------------------------------------------------------- bool wxRegion::operator==( const wxRegion& region ) { + if (m_refData == region.m_refData) return TRUE; + + if (!m_refData || !region.m_refData) return FALSE; + // compare the regions themselves, not the pointers to ref data! return gdk_region_equal(M_REGIONDATA->m_region, M_REGIONDATA_OF(region)->m_region); } -bool wxRegion::operator != ( const wxRegion& region ) -{ - return !(*this == region); -} - // ---------------------------------------------------------------------------- // wxRegion operations // ---------------------------------------------------------------------------- diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 688d7399cd..748fa87aa0 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -805,30 +805,6 @@ static int gtk_window_expose_callback( GtkWidget *widget, if (gdk_event->count == 0) win->GtkSendPaintEvents(); - // The following code will result in all window-less widgets - // being redrawn if the wxWindows class is given a chance to - // paint *anything* because it will then be allowed to paint - // over the window-less widgets. - GList *children = pizza->children; - while (children) - { - GtkPizzaChild *child = (GtkPizzaChild*) children->data; - children = children->next; - - GdkEventExpose child_event = *gdk_event; - - if (GTK_WIDGET_NO_WINDOW (child->widget) && - GTK_WIDGET_DRAWABLE (child->widget) /* && - gtk_widget_intersect (child->widget, &gdk_event->area, &child_event.area)*/ ) - { - child_event.area.x = child->widget->allocation.x; - child_event.area.y = child->widget->allocation.y; - child_event.area.width = child->widget->allocation.width; - child_event.area.height = child->widget->allocation.height; - gtk_widget_event (child->widget, (GdkEvent*) &child_event); - } - } - return TRUE; } @@ -3439,9 +3415,38 @@ void wxWindowGTK::GtkSendPaintEvents() paint_event.SetEventObject( this ); GetEventHandler()->ProcessEvent( paint_event ); - m_updateRegion.Clear(); - m_clipPaintRegion = FALSE; + + GtkPizza *pizza = GTK_PIZZA(m_wxwindow); + if (g_list_length(pizza->children) > 0) + { + // The following code will result in all window-less widgets + // being redrawn because the wxWindows class is allowed to + // paint over the window-less widgets. + GList *children = pizza->children; + while (children) + { + GtkPizzaChild *child = (GtkPizzaChild*) children->data; + children = children->next; + + if (GTK_WIDGET_NO_WINDOW (child->widget) && + GTK_WIDGET_DRAWABLE (child->widget)) + { + // Get intersection of widget area and update region + wxRegion region( m_updateRegion ); + region.Intersect( child->widget->allocation.x, + child->widget->allocation.y, + child->widget->allocation.width, + child->widget->allocation.height ); + + // Redraw the whole widget anyway + if (!region.IsEmpty()) + gtk_widget_draw( child->widget, NULL ); + } + } + } + + m_updateRegion.Clear(); } void wxWindowGTK::Clear() diff --git a/src/gtk1/brush.cpp b/src/gtk1/brush.cpp index 68d4d985f9..c6b35cc4a2 100644 --- a/src/gtk1/brush.cpp +++ b/src/gtk1/brush.cpp @@ -22,36 +22,36 @@ class wxBrushRefData: public wxObjectRefData { public: - wxBrushRefData(); - wxBrushRefData( const wxBrushRefData& data ); - - int m_style; - wxBitmap m_stipple; - wxColour m_colour; + wxBrushRefData() + { + m_style = 0; + } + + wxBrushRefData( const wxBrushRefData& data ) + { + m_style = data.m_style; + m_stipple = data.m_stipple; + m_colour = data.m_colour; + } + + bool operator == (const wxBrushRefData& data) const + { + return (m_style == data.m_style && + m_stipple == data.m_stipple && + m_colour == data.m_colour); + } + + int m_style; + wxColour m_colour; + wxBitmap m_stipple; }; -wxBrushRefData::wxBrushRefData() -{ - m_style = 0; -} - -wxBrushRefData::wxBrushRefData( const wxBrushRefData& data ) -{ - m_style = data.m_style; - m_stipple = data.m_stipple; - m_colour = data.m_colour; -} - //----------------------------------------------------------------------------- #define M_BRUSHDATA ((wxBrushRefData *)m_refData) IMPLEMENT_DYNAMIC_CLASS(wxBrush,wxGDIObject) -wxBrush::wxBrush() -{ -} - wxBrush::wxBrush( const wxColour &colour, int style ) { m_refData = new wxBrushRefData(); @@ -72,36 +72,28 @@ wxBrush::wxBrush( const wxBitmap &stippleBitmap ) M_BRUSHDATA->m_style = wxSTIPPLE; } -wxBrush::wxBrush( const wxBrush &brush ) -{ - Ref( brush ); -} - wxBrush::~wxBrush() { + // m_refData unrefed in ~wxObject } -wxBrush& wxBrush::operator = ( const wxBrush& brush ) -{ - if ( m_refData != brush.m_refData ) - Ref( brush ); - - return *this; -} - -bool wxBrush::operator == ( const wxBrush& brush ) const +wxObjectRefData *wxBrush::CreateRefData() const { - return m_refData == brush.m_refData; + return new wxBrushRefData; } -bool wxBrush::operator != ( const wxBrush& brush ) const +wxObjectRefData *wxBrush::CloneRefData(const wxObjectRefData *data) const { - return m_refData != brush.m_refData; + return new wxBrushRefData(*(wxBrushRefData *)data); } -bool wxBrush::Ok() const +bool wxBrush::operator == ( const wxBrush& brush ) const { - return ((m_refData) && M_BRUSHDATA->m_colour.Ok()); + if (m_refData == brush.m_refData) return TRUE; + + if (!m_refData || !brush.m_refData) return FALSE; + + return ( *(wxBrushRefData*)m_refData == *(wxBrushRefData*)brush.m_refData ); } int wxBrush::GetStyle() const @@ -139,25 +131,29 @@ wxBitmap *wxBrush::GetStipple() const void wxBrush::SetColour( const wxColour& col ) { - Unshare(); + AllocExclusive(); + M_BRUSHDATA->m_colour = col; } void wxBrush::SetColour( unsigned char r, unsigned char g, unsigned char b ) { - Unshare(); + AllocExclusive(); + M_BRUSHDATA->m_colour.Set( r, g, b ); } void wxBrush::SetStyle( int style ) { - Unshare(); + AllocExclusive(); + M_BRUSHDATA->m_style = style; } void wxBrush::SetStipple( const wxBitmap& stipple ) { - Unshare(); + AllocExclusive(); + M_BRUSHDATA->m_stipple = stipple; if (M_BRUSHDATA->m_stipple.GetMask()) { @@ -169,17 +165,3 @@ void wxBrush::SetStipple( const wxBitmap& stipple ) } } -void wxBrush::Unshare() -{ - if (!m_refData) - { - m_refData = new wxBrushRefData(); - } - else - { - wxBrushRefData* ref = new wxBrushRefData( *(wxBrushRefData*)m_refData ); - UnRef(); - m_refData = ref; - } -} - diff --git a/src/gtk1/colour.cpp b/src/gtk1/colour.cpp index 9ac38bff4b..8ee81076b5 100644 --- a/src/gtk1/colour.cpp +++ b/src/gtk1/colour.cpp @@ -25,13 +25,34 @@ class wxColourRefData: public wxObjectRefData { public: - wxColourRefData(); - ~wxColourRefData(); + wxColourRefData() + { + m_color.red = 0; + m_color.green = 0; + m_color.blue = 0; + m_color.pixel = 0; + m_colormap = (GdkColormap *) NULL; + m_hasPixel = FALSE; + } + + ~wxColourRefData() + { + FreeColour(); + } + bool operator == (const wxColourRefData& data) const + { + return (m_colormap == data.m_colormap && + m_hasPixel == data.m_hasPixel && + m_color.red == data.m_color.red && + m_color.green == data.m_color.green && + m_color.blue == data.m_color.blue && + m_color.pixel == data.m_color.pixel); + } + void FreeColour(); void AllocColour( GdkColormap* cmap ); -public: GdkColor m_color; GdkColormap *m_colormap; bool m_hasPixel; @@ -59,21 +80,6 @@ gushort wxColourRefData::colMapAllocCounter[ 256 ] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -wxColourRefData::wxColourRefData() -{ - m_color.red = 0; - m_color.green = 0; - m_color.blue = 0; - m_color.pixel = 0; - m_colormap = (GdkColormap *) NULL; - m_hasPixel = FALSE; -} - -wxColourRefData::~wxColourRefData() -{ - FreeColour(); -} - void wxColourRefData::FreeColour() { if (m_colormap) @@ -131,10 +137,6 @@ void wxColourRefData::AllocColour( GdkColormap *cmap ) IMPLEMENT_DYNAMIC_CLASS(wxColour,wxGDIObject) -wxColour::wxColour() -{ -} - wxColour::wxColour( unsigned char red, unsigned char green, unsigned char blue ) { m_refData = new wxColourRefData(); @@ -173,28 +175,15 @@ void wxColour::InitFromName( const wxString &colourName ) } } -wxColour::wxColour( const wxColour& col ) -{ - Ref( col ); -} - wxColour::~wxColour() { } -wxColour& wxColour::operator = ( const wxColour& col ) -{ - if (*this == col) return (*this); - Ref( col ); - return *this; -} - bool wxColour::operator == ( const wxColour& col ) const { if (m_refData == col.m_refData) return TRUE; - if (!m_refData) return FALSE; - if (!col.m_refData) return FALSE; + if (!m_refData || !col.m_refData) return FALSE; GdkColor *own = &(((wxColourRefData*)m_refData)->m_color); GdkColor *other = &(((wxColourRefData*)col.m_refData)->m_color); @@ -205,14 +194,20 @@ bool wxColour::operator == ( const wxColour& col ) const return TRUE; } -bool wxColour::operator != ( const wxColour& col) const +wxObjectRefData *wxColour::CreateRefData() const +{ + return new wxColourRefData; +} + +wxObjectRefData *wxColour::CloneRefData(const wxObjectRefData *data) const { - return !(*this == col); + return new wxColourRefData(*(wxColourRefData *)data); } void wxColour::Set( unsigned char red, unsigned char green, unsigned char blue ) { - UnRef(); + AllocExclusive(); + m_refData = new wxColourRefData(); M_COLDATA->m_color.red = ((unsigned short)red) << SHIFT; M_COLDATA->m_color.green = ((unsigned short)green) << SHIFT; @@ -241,11 +236,6 @@ unsigned char wxColour::Blue() const return (unsigned char)(M_COLDATA->m_color.blue >> SHIFT); } -bool wxColour::Ok() const -{ - return (m_refData != NULL); -} - void wxColour::CalcPixel( GdkColormap *cmap ) { if (!Ok()) return; diff --git a/src/gtk1/pen.cpp b/src/gtk1/pen.cpp index c398c71b58..7ba9b5940d 100644 --- a/src/gtk1/pen.cpp +++ b/src/gtk1/pen.cpp @@ -23,43 +23,48 @@ class wxPenRefData: public wxObjectRefData { public: - - wxPenRefData(); - wxPenRefData( const wxPenRefData& data ); - - int m_width; - int m_style; - int m_joinStyle; - int m_capStyle; - wxColour m_colour; - int m_countDashes; - wxGTKDash *m_dash; -}; - -wxPenRefData::wxPenRefData() -{ - m_width = 1; - m_style = wxSOLID; - m_joinStyle = wxJOIN_ROUND; - m_capStyle = wxCAP_ROUND; - m_dash = (wxGTKDash*) NULL; - m_countDashes = 0; -} - -wxPenRefData::wxPenRefData( const wxPenRefData& data ) -{ - m_style = data.m_style; - m_width = data.m_width; - m_joinStyle = data.m_joinStyle; - m_capStyle = data.m_capStyle; - m_colour = data.m_colour; - m_countDashes = data.m_countDashes; + wxPenRefData() + { + m_width = 1; + m_style = wxSOLID; + m_joinStyle = wxJOIN_ROUND; + m_capStyle = wxCAP_ROUND; + m_dash = (wxGTKDash*) NULL; + m_countDashes = 0; + } + + wxPenRefData( const wxPenRefData& data ) + { + m_style = data.m_style; + m_width = data.m_width; + m_joinStyle = data.m_joinStyle; + m_capStyle = data.m_capStyle; + m_colour = data.m_colour; + m_countDashes = data.m_countDashes; /* - if (data.m_dash) TODO - m_dash = new + if (data.m_dash) TODO + m_dash = new */ - m_dash = data.m_dash; -} + m_dash = data.m_dash; + } + + bool operator == (const wxPenRefData& data) const + { + return (m_style == data.m_style && + m_width == data.m_width && + m_joinStyle == data.m_joinStyle && + m_capStyle == data.m_capStyle && + m_colour == data.m_colour); + } + + int m_width; + int m_style; + int m_joinStyle; + int m_capStyle; + wxColour m_colour; + int m_countDashes; + wxGTKDash *m_dash; +}; //----------------------------------------------------------------------------- @@ -67,10 +72,6 @@ wxPenRefData::wxPenRefData( const wxPenRefData& data ) IMPLEMENT_DYNAMIC_CLASS(wxPen,wxGDIObject) -wxPen::wxPen() -{ -} - wxPen::wxPen( const wxColour &colour, int width, int style ) { m_refData = new wxPenRefData(); @@ -79,73 +80,77 @@ wxPen::wxPen( const wxColour &colour, int width, int style ) M_PENDATA->m_colour = colour; } -wxPen::wxPen( const wxPen& pen ) -{ - Ref( pen ); -} - wxPen::~wxPen() { + // m_refData unrefed in ~wxObject } -wxPen& wxPen::operator = ( const wxPen& pen ) +wxObjectRefData *wxPen::CreateRefData() const { - if ( m_refData != pen.m_refData ) - Ref( pen ); - - return *this; + return new wxPenRefData; } -bool wxPen::operator == ( const wxPen& pen ) const +wxObjectRefData *wxPen::CloneRefData(const wxObjectRefData *data) const { - return m_refData == pen.m_refData; + return new wxPenRefData(*(wxPenRefData *)data); } -bool wxPen::operator != ( const wxPen& pen ) const +bool wxPen::operator == ( const wxPen& pen ) const { - return m_refData != pen.m_refData; + if (m_refData == pen.m_refData) return TRUE; + + if (!m_refData || !pen.m_refData) return FALSE; + + return ( *(wxPenRefData*)m_refData == *(wxPenRefData*)pen.m_refData ); } void wxPen::SetColour( const wxColour &colour ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_colour = colour; } void wxPen::SetDashes( int number_of_dashes, const wxDash *dash ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_countDashes = number_of_dashes; M_PENDATA->m_dash = (wxGTKDash *)dash; /* TODO */ } void wxPen::SetColour( int red, int green, int blue ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_colour.Set( red, green, blue ); } void wxPen::SetCap( int capStyle ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_capStyle = capStyle; } void wxPen::SetJoin( int joinStyle ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_joinStyle = joinStyle; } void wxPen::SetStyle( int style ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_style = style; } void wxPen::SetWidth( int width ) { - Unshare(); + AllocExclusive(); + M_PENDATA->m_width = width; } @@ -200,22 +205,3 @@ wxColour &wxPen::GetColour() const return M_PENDATA->m_colour; } -bool wxPen::Ok() const -{ - return (m_refData != NULL); -} - -void wxPen::Unshare() -{ - if (!m_refData) - { - m_refData = new wxPenRefData(); - } - else - { - wxPenRefData* ref = new wxPenRefData( *(wxPenRefData*)m_refData ); - UnRef(); - m_refData = ref; - } -} - diff --git a/src/gtk1/region.cpp b/src/gtk1/region.cpp index 2159fea32e..2e40166981 100644 --- a/src/gtk1/region.cpp +++ b/src/gtk1/region.cpp @@ -133,22 +133,22 @@ wxObjectRefData *wxRegion::CloneRefData(const wxObjectRefData *data) const { return new wxRegionRefData(*(wxRegionRefData *)data); } + // ---------------------------------------------------------------------------- // wxRegion comparison // ---------------------------------------------------------------------------- bool wxRegion::operator==( const wxRegion& region ) { + if (m_refData == region.m_refData) return TRUE; + + if (!m_refData || !region.m_refData) return FALSE; + // compare the regions themselves, not the pointers to ref data! return gdk_region_equal(M_REGIONDATA->m_region, M_REGIONDATA_OF(region)->m_region); } -bool wxRegion::operator != ( const wxRegion& region ) -{ - return !(*this == region); -} - // ---------------------------------------------------------------------------- // wxRegion operations // ---------------------------------------------------------------------------- diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 688d7399cd..748fa87aa0 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -805,30 +805,6 @@ static int gtk_window_expose_callback( GtkWidget *widget, if (gdk_event->count == 0) win->GtkSendPaintEvents(); - // The following code will result in all window-less widgets - // being redrawn if the wxWindows class is given a chance to - // paint *anything* because it will then be allowed to paint - // over the window-less widgets. - GList *children = pizza->children; - while (children) - { - GtkPizzaChild *child = (GtkPizzaChild*) children->data; - children = children->next; - - GdkEventExpose child_event = *gdk_event; - - if (GTK_WIDGET_NO_WINDOW (child->widget) && - GTK_WIDGET_DRAWABLE (child->widget) /* && - gtk_widget_intersect (child->widget, &gdk_event->area, &child_event.area)*/ ) - { - child_event.area.x = child->widget->allocation.x; - child_event.area.y = child->widget->allocation.y; - child_event.area.width = child->widget->allocation.width; - child_event.area.height = child->widget->allocation.height; - gtk_widget_event (child->widget, (GdkEvent*) &child_event); - } - } - return TRUE; } @@ -3439,9 +3415,38 @@ void wxWindowGTK::GtkSendPaintEvents() paint_event.SetEventObject( this ); GetEventHandler()->ProcessEvent( paint_event ); - m_updateRegion.Clear(); - m_clipPaintRegion = FALSE; + + GtkPizza *pizza = GTK_PIZZA(m_wxwindow); + if (g_list_length(pizza->children) > 0) + { + // The following code will result in all window-less widgets + // being redrawn because the wxWindows class is allowed to + // paint over the window-less widgets. + GList *children = pizza->children; + while (children) + { + GtkPizzaChild *child = (GtkPizzaChild*) children->data; + children = children->next; + + if (GTK_WIDGET_NO_WINDOW (child->widget) && + GTK_WIDGET_DRAWABLE (child->widget)) + { + // Get intersection of widget area and update region + wxRegion region( m_updateRegion ); + region.Intersect( child->widget->allocation.x, + child->widget->allocation.y, + child->widget->allocation.width, + child->widget->allocation.height ); + + // Redraw the whole widget anyway + if (!region.IsEmpty()) + gtk_widget_draw( child->widget, NULL ); + } + } + } + + m_updateRegion.Clear(); } void wxWindowGTK::Clear() -- 2.47.2