// size of WM decorations
     wxSize m_decorSize;
 
+    // shape of the frame
+    wxRegion m_shape;
+
     // private gtk_timeout_add result for mimicing wxUSER_ATTENTION_INFO and
     // wxUSER_ATTENTION_ERROR difference, -2 for no hint, -1 for ERROR hint, rest for GtkTimeout handle.
     int m_urgency_hint;
 
     void OnMouseMove(wxMouseEvent& evt);
     void OnExit(wxMouseEvent& evt);
     void OnPaint(wxPaintEvent& evt);
-    void OnWindowCreate(wxWindowCreateEvent& evt);
 
 private:
     bool     m_hasShape;
     EVT_LEFT_UP(ShapedFrame::OnLeftUp)
     EVT_MOTION(ShapedFrame::OnMouseMove)
     EVT_RIGHT_UP(ShapedFrame::OnExit)
-
     EVT_PAINT(ShapedFrame::OnPaint)
-
-#ifdef __WXGTK__
-    EVT_WINDOW_CREATE(ShapedFrame::OnWindowCreate)
-#endif
 END_EVENT_TABLE()
 
 
     m_bmp = wxBitmap(_T("star.png"), wxBITMAP_TYPE_PNG);
     SetSize(wxSize(m_bmp.GetWidth(), m_bmp.GetHeight()));
     SetToolTip(wxT("Right-click to close"));
-
-#ifndef __WXGTK__
-    // On wxGTK we can't do this yet because the window hasn't been created
-    // yet so we wait until the EVT_WINDOW_CREATE event happens.  On wxMSW and
-    // wxMac the window has been created at this point so we go ahead and set
-    // the shape now.
     SetWindowShape();
-#endif
 }
 
 void ShapedFrame::SetWindowShape()
     dc.DrawBitmap(m_bmp, 0, 0, true);
 }
 
-void ShapedFrame::OnWindowCreate(wxWindowCreateEvent& WXUNUSED(evt))
-{
-    SetWindowShape();
-}
-
 // ----------------------------------------------------------------------------
 // see-through frame
 // ----------------------------------------------------------------------------
 
         win->SetIcon( wxNullIcon );
         win->SetIcons( iconsOld );
     }
+
+    if (win->HasFlag(wxFRAME_SHAPED))
+        win->SetShape(win->m_shape); // it will really set the window shape now
 }
 }
 
     wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,
                  _T("Shaped windows must be created with the wxFRAME_SHAPED style."));
 
-    GdkWindow *window = NULL;
-    if (m_wxwindow)
+    if ( GTK_WIDGET_REALIZED(m_widget) )
+    {
+        if ( m_wxwindow )
+            do_shape_combine_region(m_wxwindow->window, region);
+
+        return do_shape_combine_region(m_widget->window, region);
+    }
+    else // not realized yet
     {
-        do_shape_combine_region(m_wxwindow->window, region);
+        // store the shape to set, it will be really set once we're realized
+        m_shape = region;
+
+        // we don't know if we're going to succeed or fail, be optimistic by
+        // default
+        return true;
     }
-    window = m_widget->window;
-    return do_shape_combine_region(window, region);
 }
 
 bool wxTopLevelWindowGTK::IsActive()