]> git.saurik.com Git - wxWidgets.git/commitdiff
Make hack for button creation in wxOSX more robust.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 4 Nov 2012 23:54:37 +0000 (23:54 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 4 Nov 2012 23:54:37 +0000 (23:54 +0000)
Don't crash when creating a plain wxButton with wxBU_NOTEXT style. This
happened because we skipped creating the peer (real implementation) in this
case entirely on the assumption that we were creating a wxBitmapButton, but
this is not necessarily the case. So now test that the creation of the peer is
really disabled before skipping it (this required adding ShouldCreatePeer()
accessor).

Merging wxWidgetImpl::CreateButton() and CreateBitmapButton() (and the same
thing for toggle buttons) would still be a better solution but while it's
trivial to do for Cocoa, it isn't for Carbon. And we can't use a single
function for Cocoa but different functions for Carbon, so for now just
continue to use this hack.

Closes #13622.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72896 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/osx/window.h
src/osx/button_osx.cpp
src/osx/window_osx.cpp

index 757455f81332f9cf1d23b230e038f8c3b4d908e9..c97e979c8a8b113de4afc2f239b81cd8153b626f 100644 (file)
@@ -259,7 +259,10 @@ public:
     // optimization to avoid creating a user pane in wxWindow::Create if we already know
     // we will replace it with our own peer
     void                DontCreatePeer();
-    
+
+    // return true unless DontCreatePeer() had been called
+    bool                ShouldCreatePeer() const;
+
     // sets the native implementation wrapper, can replace an existing peer, use peer = NULL to 
     // release existing peer
     void                SetPeer(wxOSXWidgetImpl* peer);
index 432f1f08af41592e15e9cf3d31c0fd55dc01aa1c..32417fa88cc82aeaa1059255cc84ad25e690d3e2 100644 (file)
@@ -51,23 +51,23 @@ bool wxButton::Create(wxWindow *parent,
     const wxValidator& validator,
     const wxString& name)
 {
-    DontCreatePeer();
-    
-    m_marginX =
-    m_marginY = 0;
-
     // FIXME: this hack is needed because we're called from
     //        wxBitmapButton::Create() with this style and we currently use a
     //        different wxWidgetImpl method (CreateBitmapButton() rather than
     //        CreateButton()) for creating bitmap buttons, but we really ought
     //        to unify the creation of buttons of all kinds and then remove
     //        this check
-    if ( style & wxBU_NOTEXT )
+    if ( style & wxBU_NOTEXT && !ShouldCreatePeer() )
     {
         return wxControl::Create(parent, id, pos, size, style,
                                  validator, name);
     }
 
+    DontCreatePeer();
+
+    m_marginX =
+    m_marginY = 0;
+
     wxString label;
 
     // Ignore the standard label for help buttons if possible, they use "?"
index f09d216e64795786e7405c555ba7b775ce5f5583..bb67d1afb379c7c92383b85fa413a643d38d63de 100644 (file)
@@ -301,6 +301,11 @@ wxOSXWidgetImpl* wxWindowMac::GetPeer() const
     return m_peer == kOSXNoWidgetImpl ? NULL : m_peer ; 
 }
 
+bool wxWindowMac::ShouldCreatePeer() const
+{
+    return m_peer != kOSXNoWidgetImpl;
+}
+
 void wxWindowMac::DontCreatePeer()
 {
     m_peer = kOSXNoWidgetImpl;