From 06e56e62b9ab3a4ee66d7013c978128e5021f4e2 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Wed, 12 Jun 2013 20:44:40 +0000 Subject: [PATCH] guarding open combo box against AppDefined NSEvents issued by wxEventLoop::WakeUp, fixes #15115 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74186 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/osx/cocoa/combobox.mm | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/osx/cocoa/combobox.mm b/src/osx/cocoa/combobox.mm index 974ae190dc..71fcec15b5 100644 --- a/src/osx/cocoa/combobox.mm +++ b/src/osx/cocoa/combobox.mm @@ -108,14 +108,9 @@ // For some reason, wxComboBox::GetValue will not return the newly selected item // while we're inside this callback, so use AddPendingEvent to make sure // GetValue() returns the right value. - wxEventLoop* const loop = (wxEventLoop*) wxEventLoopBase::GetActive(); - if ( loop ) - loop->OSXUseLowLevelWakeup(true); wxpeer->GetEventHandler()->AddPendingEvent( event ); - if ( loop ) - loop->OSXUseLowLevelWakeup(false); } } } @@ -131,6 +126,30 @@ wxNSComboBoxControl::~wxNSComboBoxControl() { } +void wxNSComboBoxControl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) +{ + // NSComboBox has its own event loop, which reacts very badly to our synthetic + // events used to signal when a wxEvent is posted, so during that time we switch + // the wxEventLoop::WakeUp implementation to a lower-level version + + bool reset = false; + wxEventLoop* const loop = (wxEventLoop*) wxEventLoopBase::GetActive(); + + if ( loop != NULL && [event type] == NSLeftMouseDown ) + { + reset = true; + loop->OSXUseLowLevelWakeup(true); + } + + wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; + superimpl(slf, (SEL)_cmd, event); + + if ( reset ) + { + loop->OSXUseLowLevelWakeup(true); + } +} + int wxNSComboBoxControl::GetSelectedItem() const { return [m_comboBox indexOfSelectedItem]; @@ -214,8 +233,9 @@ void wxNSComboBoxControl::SetEditable(bool editable) { // TODO: unfortunately this does not work, setEditable just means the same as CB_READONLY // I don't see a way to access the text field directly - NSComboBoxCell* c = [m_comboBox cell]; - [c setEditable:editable]; + + // Behavior NONE <- SELECTECTABLE + [m_comboBox setEditable:editable]; } wxWidgetImplType* wxWidgetImpl::CreateComboBox( wxComboBox* wxpeer, -- 2.47.2