From 98f5315405cf4cfc11ec3c7015146804267e67f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Va=CC=81clav=20Slavi=CC=81k?= Date: Fri, 29 Apr 2016 17:26:02 +0200 Subject: [PATCH] Don't set initial label in wxNativeWindow on OS X Differentiate between setting the label from SetLabel() and from SetPeer() (i.e. initially), because some native controls shouldn't have an empty string set as their intitial value. Override SetInitialSize() to be empty for wxNativeWindow in order to prevent label-setting issues when an unknown, caller-controlled native widget is attached. Reverts db9baf9aa5565a7a4f92097b2f0c85439c35b4a6, which was the previous attempt to fix this, but was causing too many problems elsewhere. --- include/wx/osx/core/private.h | 2 ++ src/osx/cocoa/nativewin.mm | 23 ++++++++++++++++++++++- src/osx/window_osx.cpp | 3 +-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/include/wx/osx/core/private.h b/include/wx/osx/core/private.h index 5d91413470..b21995257a 100644 --- a/include/wx/osx/core/private.h +++ b/include/wx/osx/core/private.h @@ -288,6 +288,8 @@ public : #if wxUSE_MARKUP && wxOSX_USE_COCOA virtual void SetLabelMarkup( const wxString& WXUNUSED(markup) ) { } #endif + virtual void SetInitialLabel( const wxString& title, wxFontEncoding encoding ) + { SetLabel(title, encoding); } virtual void SetCursor( const wxCursor & cursor ) = 0; virtual void CaptureMouse() = 0; diff --git a/src/osx/cocoa/nativewin.mm b/src/osx/cocoa/nativewin.mm index f2be5a7873..82dc4775d1 100644 --- a/src/osx/cocoa/nativewin.mm +++ b/src/osx/cocoa/nativewin.mm @@ -30,6 +30,27 @@ // implementation // ============================================================================ +namespace +{ + +class wxNativeWidgetCocoaImpl : public wxWidgetCocoaImpl +{ +public: + wxNativeWidgetCocoaImpl(wxWindowMac* peer, WXWidget w) : wxWidgetCocoaImpl(peer, w) + {} + + virtual void SetInitialLabel(const wxString& WXUNUSED(title), wxFontEncoding WXUNUSED(encoding)) wxOVERRIDE + { + // Don't set initial label, because the control was created by the + // caller and is already fully setup. And some controls (notably + // NSPathControl) assert if an unexpected string value, such as an empty + // string, is set. + } +}; + +} // anonymous namespace + + bool wxNativeWindow::Create(wxWindow* parent, wxWindowID winid, @@ -62,7 +83,7 @@ wxNativeWindow::Create(wxWindow* parent, // As wxWidgets will release the view when this object is destroyed, retain // it here to avoid destroying the view owned by the user code. [view retain]; - SetPeer(new wxWidgetCocoaImpl(this, view)); + SetPeer(new wxNativeWidgetCocoaImpl(this, view)); // It doesn't seem necessary to use MacPostControlCreate() here as we never // change the native control geometry here. diff --git a/src/osx/window_osx.cpp b/src/osx/window_osx.cpp index f12c025753..97acee559d 100644 --- a/src/osx/window_osx.cpp +++ b/src/osx/window_osx.cpp @@ -353,8 +353,7 @@ void wxWindowMac::SetPeer(wxOSXWidgetImpl* peer) if ( !m_hasFont ) DoSetWindowVariant( m_windowVariant ); - if ( !m_label.empty() ) - GetPeer()->SetLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics), GetFont().GetEncoding() ) ; + GetPeer()->SetInitialLabel( wxStripMenuCodes(m_label, wxStrip_Mnemonics), GetFont().GetEncoding() ) ; // for controls we want to use best size for wxDefaultSize params ) if ( !GetPeer()->IsUserPane() )