Skip to content

Commit

Permalink
Don't set initial label in wxNativeWindow on OS X
Browse files Browse the repository at this point in the history
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 db9baf9,
which was the previous attempt to fix this, but was causing too many
problems elsewhere.
  • Loading branch information
vslavik committed Apr 29, 2016
1 parent 77939b4 commit 98f5315
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 3 deletions.
2 changes: 2 additions & 0 deletions include/wx/osx/core/private.h
Expand Up @@ -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;
Expand Down
23 changes: 22 additions & 1 deletion src/osx/cocoa/nativewin.mm
Expand Up @@ -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,
Expand Down Expand Up @@ -62,7 +83,7 @@
// 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.
Expand Down
3 changes: 1 addition & 2 deletions src/osx/window_osx.cpp
Expand Up @@ -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() )
Expand Down

0 comments on commit 98f5315

Please sign in to comment.