]> git.saurik.com Git - wxWidgets.git/commitdiff
Made wxWindowBase's variables protected again and such.
authorRobert Roebling <robert@roebling.de>
Mon, 10 May 1999 21:04:17 +0000 (21:04 +0000)
committerRobert Roebling <robert@roebling.de>
Mon, 10 May 1999 21:04:17 +0000 (21:04 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2400 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/window.h
include/wx/gtk1/window.h
include/wx/window.h
src/gtk/dialog.cpp
src/gtk/window.cpp
src/gtk1/dialog.cpp
src/gtk1/window.cpp

index 0d38f748bd0e2fe45e149bdef2136e4a7648e49a..b43b7e8c1c4132fbd554c1f63a339b9412057c2f 100644 (file)
@@ -143,19 +143,24 @@ public:
     virtual bool IsOwnGtkWindow( GdkWindow *window );
     void ConnectWidget( GtkWidget *widget );
 
+    // creates a new widget style if none is there
+    // and sets m_widgetStyle to this value.
     GtkStyle *GetWidgetStyle();
+    
+    // called by SetFont() and SetXXXColour etc
     void SetWidgetStyle();
+    
+    // overridden in many GTK widgets
     virtual void ApplyWidgetStyle();
 
 #if wxUSE_TOOLTIPS
     virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
 #endif // wxUSE_TOOLTIPS
 
-    // called from GTK signales handlers
+    // called from GTK signales handlers. it indicates that
+    // the layouting functions have to be called later on
+    // (i.e. in idle time, implemented in OnInternalIdle() ).
     void UpdateSize() { m_sizeSet = FALSE; }
-    void InternalSetPosition(int x, int y) { m_x = x; m_y = y; }
-    void InternalSetSize(int w, int h)
-        { m_width = w; m_height = h; UpdateSize(); }
 
     // position and size of the window
     int                  m_x, m_y;
@@ -167,8 +172,13 @@ public:
 
     // scrolling stuff
     GtkAdjustment       *m_hAdjust,*m_vAdjust;
-    float                m_oldHorizontalPos,
-                         m_oldVerticalPos;
+    float                m_oldHorizontalPos;
+    float                m_oldVerticalPos;
+
+    // we need an extra XGC flag set to get exposed
+    // events from overlapping children upon moving
+    // them. this flag will be set in this GC and
+    // the GC will be used in wxWindow::ScrollWindow().
     GdkGC               *m_scrollGC;
 
     // extra (wxGTK-specific) flags
@@ -181,9 +191,28 @@ public:
     bool                 m_isStaticBox:1;   /* faster than IS_KIND_OF */
     bool                 m_isFrame:1;       /* faster than IS_KIND_OF */
     bool                 m_acceptsFocus:1;  /* ! wxStaticBox etc.  */
-
+    
+    // these are true if the style were set before the
+    // widget was realized (typcally in the constructor)
+    // but the actual GTK style must not be set before
+    // the widget has been "realized"
+    bool                 m_delayedFont:1;
+    bool                 m_delayedForegroundColour:1;
+    bool                 m_delayedBackgroundColour:1;
+    bool                 m_delayedCursor:1;
+
+    // contains GTK's widgets internal information
+    // about non-default widget font and colours.
+    // we create one for each widget that gets any
+    // non-default attribute set via SetFont() or
+    // SetForegroundColour() / SetBackgroundColour().
     GtkStyle            *m_widgetStyle;
 
+    // C++ has no virtual methods in the constrcutor
+    // of any class but we need different methods
+    // of inserting a child window into a wxFrame,
+    // wxMDIFrame, wxNotebook etc. this is the
+    // callback that will get used.
     wxInsertChildFunction  m_insertCallback;
 
     // implement the base class pure virtuals
index 0d38f748bd0e2fe45e149bdef2136e4a7648e49a..b43b7e8c1c4132fbd554c1f63a339b9412057c2f 100644 (file)
@@ -143,19 +143,24 @@ public:
     virtual bool IsOwnGtkWindow( GdkWindow *window );
     void ConnectWidget( GtkWidget *widget );
 
+    // creates a new widget style if none is there
+    // and sets m_widgetStyle to this value.
     GtkStyle *GetWidgetStyle();
+    
+    // called by SetFont() and SetXXXColour etc
     void SetWidgetStyle();
+    
+    // overridden in many GTK widgets
     virtual void ApplyWidgetStyle();
 
 #if wxUSE_TOOLTIPS
     virtual void ApplyToolTip( GtkTooltips *tips, const wxChar *tip );
 #endif // wxUSE_TOOLTIPS
 
-    // called from GTK signales handlers
+    // called from GTK signales handlers. it indicates that
+    // the layouting functions have to be called later on
+    // (i.e. in idle time, implemented in OnInternalIdle() ).
     void UpdateSize() { m_sizeSet = FALSE; }
-    void InternalSetPosition(int x, int y) { m_x = x; m_y = y; }
-    void InternalSetSize(int w, int h)
-        { m_width = w; m_height = h; UpdateSize(); }
 
     // position and size of the window
     int                  m_x, m_y;
@@ -167,8 +172,13 @@ public:
 
     // scrolling stuff
     GtkAdjustment       *m_hAdjust,*m_vAdjust;
-    float                m_oldHorizontalPos,
-                         m_oldVerticalPos;
+    float                m_oldHorizontalPos;
+    float                m_oldVerticalPos;
+
+    // we need an extra XGC flag set to get exposed
+    // events from overlapping children upon moving
+    // them. this flag will be set in this GC and
+    // the GC will be used in wxWindow::ScrollWindow().
     GdkGC               *m_scrollGC;
 
     // extra (wxGTK-specific) flags
@@ -181,9 +191,28 @@ public:
     bool                 m_isStaticBox:1;   /* faster than IS_KIND_OF */
     bool                 m_isFrame:1;       /* faster than IS_KIND_OF */
     bool                 m_acceptsFocus:1;  /* ! wxStaticBox etc.  */
-
+    
+    // these are true if the style were set before the
+    // widget was realized (typcally in the constructor)
+    // but the actual GTK style must not be set before
+    // the widget has been "realized"
+    bool                 m_delayedFont:1;
+    bool                 m_delayedForegroundColour:1;
+    bool                 m_delayedBackgroundColour:1;
+    bool                 m_delayedCursor:1;
+
+    // contains GTK's widgets internal information
+    // about non-default widget font and colours.
+    // we create one for each widget that gets any
+    // non-default attribute set via SetFont() or
+    // SetForegroundColour() / SetBackgroundColour().
     GtkStyle            *m_widgetStyle;
 
+    // C++ has no virtual methods in the constrcutor
+    // of any class but we need different methods
+    // of inserting a child window into a wxFrame,
+    // wxMDIFrame, wxNotebook etc. this is the
+    // callback that will get used.
     wxInsertChildFunction  m_insertCallback;
 
     // implement the base class pure virtuals
index bfbfb268083ab511f7330c9dc7e0b97a666c62fe..9fb6eb4e7d01e869e095f89d0c1e55e61d7633cf 100644 (file)
@@ -596,14 +596,10 @@ public:
     void OnInitDialog( wxInitDialogEvent &event );
 
 /*
-   What is this doing in the platform independent part?
+    // What is this doing in the platform independent part?
+    // No doc specifies this. Of what use would that be?
 
-        // accessors
-    WXWidget GetHandle() const { return m_widget; }
-
-    // the window handle (for the underlying windowing system) and the window
-    // id - a number which uniquely identifies a window among its siblings
-    // unless it is -1
+    // the window handle (for the underlying windowing system)
     union
     {
         // we have 2 common names for this member, one for MSW and the other
@@ -611,8 +607,15 @@ public:
         WXWidget m_widget;
         WXWidget m_hWnd;
     };
+    
+    // accessor
+    WXWidget GetHandle() const { return m_widget; }
+    
 */
 
+protected:
+    // the window id - a number which uniquely identifies a window among 
+    // its siblings  unless it is -1
     wxWindowID           m_windowId;
 
     // the parent window of this window (or NULL) and the list of the children
index 43e102b9aac3d3d05ea9ae254c563eba4e4e6a16..ee60f258f2873bb61975b7746d2b90f91e9eb5e6 100644 (file)
@@ -284,7 +284,7 @@ void wxDialog::OnCancel( wxCommandEvent &WXUNUSED(event) )
     else
     {
         SetReturnCode(wxID_CANCEL);
-        this->Show(FALSE);
+        Show(FALSE);
     }
 }
 
@@ -296,12 +296,12 @@ void wxDialog::OnOK( wxCommandEvent &WXUNUSED(event) )
         printf( "OnOK 2.\n" );
         if (IsModal())
         {
-        printf( "OnOK: modal.\n" );
+            printf( "OnOK: modal.\n" );
             EndModal(wxID_OK);
         }
         else
         {
-        printf( "OnOK: non-modal.\n" );
+            printf( "OnOK: non-modal.\n" );
             SetReturnCode(wxID_OK);
             this->Show(FALSE);
         }
@@ -508,21 +508,11 @@ bool wxDialog::Show( bool show )
         GtkOnSize( m_x, m_y, m_width, m_height );
     }
 
-    if (show != m_isShown)
-    {
-        if (show)
-        {
-            gtk_widget_show( m_widget );
-        }
-        else
-            gtk_widget_hide( m_widget );
-            
-        m_isShown = show;
-    }
+    bool ret = wxWindow::Show( show );
 
     if (show) InitDialog();
 
-    return TRUE;
+    return ret;
 }
 
 bool wxDialog::IsModal() const
index 1b22724b4ba7a263679b03c2362615e0e7bd9620..4abdea598ab7dd4cc68ebbb40f1b9dc141208ad4 100644 (file)
@@ -1374,30 +1374,16 @@ gtk_window_realized_callback( GtkWidget *widget, wxWindow *win )
     if (g_isIdle) 
         wxapp_install_idle_handler();
 
-    if (win->m_font != *wxSWISS_FONT)
-    {
-        wxFont font( win->m_font );
-        win->m_font = wxNullFont;
-       win->SetFont( font );
-    }
+    if (win->m_delayedFont)
+        win->SetFont( win->GetFont() );
 
-    if (win->m_backgroundColour != wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ))
-    {
-        wxColour bg( win->m_backgroundColour );
-       win->m_backgroundColour = wxNullColour;
-       win->SetBackgroundColour( bg );
-    }
+    if (win->m_delayedBackgroundColour)
+        win->SetBackgroundColour( win->GetBackgroundColour() );
 
-    if (win->m_foregroundColour != *wxBLACK)
-    {
-        wxColour fg( win->m_foregroundColour );
-       win->m_foregroundColour = wxNullColour;
-       win->SetForegroundColour( fg );
-    }
+    if (win->m_delayedForegroundColour)
+        win->SetForegroundColour( win->GetForegroundColour() );
 
-    wxCursor cursor( win->m_cursor );
-    win->m_cursor = wxNullCursor;
-    win->SetCursor( cursor );
+    win->SetCursor( win->GetCursor() );
 
     return FALSE;
 }
@@ -1464,9 +1450,6 @@ void wxWindow::Init()
     m_width = 0;
     m_height = 0;
 
-    m_font = *wxSWISS_FONT;
-    m_windowName = "noname";
-
     m_sizeSet = FALSE;
     m_hasVMT = FALSE;
     m_needParent = TRUE;
@@ -2098,8 +2081,11 @@ bool wxWindow::Show( bool show )
 {
     wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
 
-    if ( !wxWindowBase::Show(show) )
+    if (!wxWindowBase::Show(show))
+    {
+        // nothing to do
         return FALSE;
+    }
 
     if (show)
         gtk_widget_show( m_widget );
@@ -2113,8 +2099,11 @@ bool wxWindow::Enable( bool enable )
 {
     wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
 
-    if ( !wxWindowBase::Enable(enable) )
+    if (!wxWindowBase::Enable(enable))
+    {
+        // nothing to do
         return FALSE;
+    }
 
     gtk_widget_set_sensitive( m_widget, enable );
     if ( m_wxwindow )
@@ -2234,9 +2223,24 @@ bool wxWindow::SetCursor( const wxCursor &cursor )
 {
     wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
 
-    if ( wxWindowBase::SetCursor(cursor) )
+    if (!wxWindowBase::SetCursor(cursor))
     {
-        if (!m_widget->window) return TRUE;
+        // don't leave if the GTK widget has just
+        // been realized
+        if (!m_delayedCursor) return FALSE;
+    }
+    
+    GtkWidget *connect_widget = GetConnectWidget();
+    if (!connect_widget->window)
+    {
+        // indicate that a new style has been set
+       // but it couldn't get applied as the
+       // widget hasn't been realized yet.
+       m_delayedCursor = TRUE;
+       
+       // pretend we have done something
+        return TRUE;
+    }
 
         if ((m_widget) && (m_widget->window))
              gdk_window_set_cursor( m_widget->window, GetCursor().GetCursor() );
@@ -2244,14 +2248,8 @@ bool wxWindow::SetCursor( const wxCursor &cursor )
         if ((m_wxwindow) && (m_wxwindow->window))
              gdk_window_set_cursor( m_wxwindow->window, GetCursor().GetCursor() );
 
-        // cursor was set
-        return TRUE;
-    }
-    else
-    {
-        // cursor hasn't been changed
-        return FALSE;
-    }
+    // cursor was set
+    return TRUE;
 }
 
 void wxWindow::WarpPointer( int WXUNUSED(x), int WXUNUSED(y) )
@@ -2332,10 +2330,24 @@ bool wxWindow::SetBackgroundColour( const wxColour &colour )
 {
     wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") );
 
-    if (!wxWindowBase::SetBackgroundColour(colour)) return FALSE;
-
+    if (!wxWindowBase::SetBackgroundColour(colour))
+    {
+        // don't leave if the GTK widget has just
+        // been realized
+        if (!m_delayedBackgroundColour) return FALSE;
+    }
+    
     GtkWidget *connect_widget = GetConnectWidget();
-    if (!connect_widget->window) return TRUE;
+    if (!connect_widget->window)
+    {
+        // indicate that a new style has been set
+       // but it couldn't get applied as the
+       // widget hasn't been realized yet.
+       m_delayedBackgroundColour = TRUE;
+       
+       // pretend we have done something
+        return TRUE;
+    }
 
     if (m_wxwindow && m_wxwindow->window)
     {
@@ -2366,10 +2378,24 @@ bool wxWindow::SetForegroundColour( const wxColour &colour )
 {
     wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") );
 
-    if (!wxWindowBase::SetForegroundColour(colour)) return FALSE;
-
+    if (!wxWindowBase::SetForegroundColour(colour))
+    {
+        // don't leave if the GTK widget has just
+        // been realized
+        if (!m_delayedForegroundColour) return FALSE;
+    }
+    
     GtkWidget *connect_widget = GetConnectWidget();
-    if (!connect_widget->window) return TRUE;
+    if (!connect_widget->window)
+    {
+        // indicate that a new style has been set
+       // but it couldn't get applied as the
+       // widget hasn't been realized yet.
+       m_delayedForegroundColour = TRUE;
+       
+       // pretend we have done something
+        return TRUE;
+    }
 
     wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
     if (sysbg == m_foregroundColour)
@@ -2514,10 +2540,24 @@ bool wxWindow::SetFont( const wxFont &font )
 {
     wxCHECK_MSG( m_widget != NULL, FALSE, _T(  "invalid window") );
 
-    if (!wxWindowBase::SetFont(font)) return FALSE;
+    if (!wxWindowBase::SetFont(font))
+    {
+        // don't leave if the GTK widget has just
+        // been realized
+        if (!m_delayedFont) return FALSE;
+    }
     
     GtkWidget *connect_widget = GetConnectWidget();
-    if (!connect_widget->window) return TRUE;
+    if (!connect_widget->window)
+    {
+        // indicate that a new style has been set
+       // but it couldn't get applied as the
+       // widget hasn't been realized yet.
+       m_delayedFont = TRUE;
+       
+       // pretend we have done something
+        return TRUE;
+    }
 
     wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
     if ( sysbg == m_backgroundColour )
index 43e102b9aac3d3d05ea9ae254c563eba4e4e6a16..ee60f258f2873bb61975b7746d2b90f91e9eb5e6 100644 (file)
@@ -284,7 +284,7 @@ void wxDialog::OnCancel( wxCommandEvent &WXUNUSED(event) )
     else
     {
         SetReturnCode(wxID_CANCEL);
-        this->Show(FALSE);
+        Show(FALSE);
     }
 }
 
@@ -296,12 +296,12 @@ void wxDialog::OnOK( wxCommandEvent &WXUNUSED(event) )
         printf( "OnOK 2.\n" );
         if (IsModal())
         {
-        printf( "OnOK: modal.\n" );
+            printf( "OnOK: modal.\n" );
             EndModal(wxID_OK);
         }
         else
         {
-        printf( "OnOK: non-modal.\n" );
+            printf( "OnOK: non-modal.\n" );
             SetReturnCode(wxID_OK);
             this->Show(FALSE);
         }
@@ -508,21 +508,11 @@ bool wxDialog::Show( bool show )
         GtkOnSize( m_x, m_y, m_width, m_height );
     }
 
-    if (show != m_isShown)
-    {
-        if (show)
-        {
-            gtk_widget_show( m_widget );
-        }
-        else
-            gtk_widget_hide( m_widget );
-            
-        m_isShown = show;
-    }
+    bool ret = wxWindow::Show( show );
 
     if (show) InitDialog();
 
-    return TRUE;
+    return ret;
 }
 
 bool wxDialog::IsModal() const
index 1b22724b4ba7a263679b03c2362615e0e7bd9620..4abdea598ab7dd4cc68ebbb40f1b9dc141208ad4 100644 (file)
@@ -1374,30 +1374,16 @@ gtk_window_realized_callback( GtkWidget *widget, wxWindow *win )
     if (g_isIdle) 
         wxapp_install_idle_handler();
 
-    if (win->m_font != *wxSWISS_FONT)
-    {
-        wxFont font( win->m_font );
-        win->m_font = wxNullFont;
-       win->SetFont( font );
-    }
+    if (win->m_delayedFont)
+        win->SetFont( win->GetFont() );
 
-    if (win->m_backgroundColour != wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ))
-    {
-        wxColour bg( win->m_backgroundColour );
-       win->m_backgroundColour = wxNullColour;
-       win->SetBackgroundColour( bg );
-    }
+    if (win->m_delayedBackgroundColour)
+        win->SetBackgroundColour( win->GetBackgroundColour() );
 
-    if (win->m_foregroundColour != *wxBLACK)
-    {
-        wxColour fg( win->m_foregroundColour );
-       win->m_foregroundColour = wxNullColour;
-       win->SetForegroundColour( fg );
-    }
+    if (win->m_delayedForegroundColour)
+        win->SetForegroundColour( win->GetForegroundColour() );
 
-    wxCursor cursor( win->m_cursor );
-    win->m_cursor = wxNullCursor;
-    win->SetCursor( cursor );
+    win->SetCursor( win->GetCursor() );
 
     return FALSE;
 }
@@ -1464,9 +1450,6 @@ void wxWindow::Init()
     m_width = 0;
     m_height = 0;
 
-    m_font = *wxSWISS_FONT;
-    m_windowName = "noname";
-
     m_sizeSet = FALSE;
     m_hasVMT = FALSE;
     m_needParent = TRUE;
@@ -2098,8 +2081,11 @@ bool wxWindow::Show( bool show )
 {
     wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
 
-    if ( !wxWindowBase::Show(show) )
+    if (!wxWindowBase::Show(show))
+    {
+        // nothing to do
         return FALSE;
+    }
 
     if (show)
         gtk_widget_show( m_widget );
@@ -2113,8 +2099,11 @@ bool wxWindow::Enable( bool enable )
 {
     wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
 
-    if ( !wxWindowBase::Enable(enable) )
+    if (!wxWindowBase::Enable(enable))
+    {
+        // nothing to do
         return FALSE;
+    }
 
     gtk_widget_set_sensitive( m_widget, enable );
     if ( m_wxwindow )
@@ -2234,9 +2223,24 @@ bool wxWindow::SetCursor( const wxCursor &cursor )
 {
     wxCHECK_MSG( (m_widget != NULL), FALSE, _T("invalid window") );
 
-    if ( wxWindowBase::SetCursor(cursor) )
+    if (!wxWindowBase::SetCursor(cursor))
     {
-        if (!m_widget->window) return TRUE;
+        // don't leave if the GTK widget has just
+        // been realized
+        if (!m_delayedCursor) return FALSE;
+    }
+    
+    GtkWidget *connect_widget = GetConnectWidget();
+    if (!connect_widget->window)
+    {
+        // indicate that a new style has been set
+       // but it couldn't get applied as the
+       // widget hasn't been realized yet.
+       m_delayedCursor = TRUE;
+       
+       // pretend we have done something
+        return TRUE;
+    }
 
         if ((m_widget) && (m_widget->window))
              gdk_window_set_cursor( m_widget->window, GetCursor().GetCursor() );
@@ -2244,14 +2248,8 @@ bool wxWindow::SetCursor( const wxCursor &cursor )
         if ((m_wxwindow) && (m_wxwindow->window))
              gdk_window_set_cursor( m_wxwindow->window, GetCursor().GetCursor() );
 
-        // cursor was set
-        return TRUE;
-    }
-    else
-    {
-        // cursor hasn't been changed
-        return FALSE;
-    }
+    // cursor was set
+    return TRUE;
 }
 
 void wxWindow::WarpPointer( int WXUNUSED(x), int WXUNUSED(y) )
@@ -2332,10 +2330,24 @@ bool wxWindow::SetBackgroundColour( const wxColour &colour )
 {
     wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") );
 
-    if (!wxWindowBase::SetBackgroundColour(colour)) return FALSE;
-
+    if (!wxWindowBase::SetBackgroundColour(colour))
+    {
+        // don't leave if the GTK widget has just
+        // been realized
+        if (!m_delayedBackgroundColour) return FALSE;
+    }
+    
     GtkWidget *connect_widget = GetConnectWidget();
-    if (!connect_widget->window) return TRUE;
+    if (!connect_widget->window)
+    {
+        // indicate that a new style has been set
+       // but it couldn't get applied as the
+       // widget hasn't been realized yet.
+       m_delayedBackgroundColour = TRUE;
+       
+       // pretend we have done something
+        return TRUE;
+    }
 
     if (m_wxwindow && m_wxwindow->window)
     {
@@ -2366,10 +2378,24 @@ bool wxWindow::SetForegroundColour( const wxColour &colour )
 {
     wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") );
 
-    if (!wxWindowBase::SetForegroundColour(colour)) return FALSE;
-
+    if (!wxWindowBase::SetForegroundColour(colour))
+    {
+        // don't leave if the GTK widget has just
+        // been realized
+        if (!m_delayedForegroundColour) return FALSE;
+    }
+    
     GtkWidget *connect_widget = GetConnectWidget();
-    if (!connect_widget->window) return TRUE;
+    if (!connect_widget->window)
+    {
+        // indicate that a new style has been set
+       // but it couldn't get applied as the
+       // widget hasn't been realized yet.
+       m_delayedForegroundColour = TRUE;
+       
+       // pretend we have done something
+        return TRUE;
+    }
 
     wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
     if (sysbg == m_foregroundColour)
@@ -2514,10 +2540,24 @@ bool wxWindow::SetFont( const wxFont &font )
 {
     wxCHECK_MSG( m_widget != NULL, FALSE, _T(  "invalid window") );
 
-    if (!wxWindowBase::SetFont(font)) return FALSE;
+    if (!wxWindowBase::SetFont(font))
+    {
+        // don't leave if the GTK widget has just
+        // been realized
+        if (!m_delayedFont) return FALSE;
+    }
     
     GtkWidget *connect_widget = GetConnectWidget();
-    if (!connect_widget->window) return TRUE;
+    if (!connect_widget->window)
+    {
+        // indicate that a new style has been set
+       // but it couldn't get applied as the
+       // widget hasn't been realized yet.
+       m_delayedFont = TRUE;
+       
+       // pretend we have done something
+        return TRUE;
+    }
 
     wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
     if ( sysbg == m_backgroundColour )