X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d4e5c5b98a5a80c5cc65776f2add32ff543c2972..c02aa4b3a1cb95dce9232adc99876567085e6aff:/src/osx/cocoa/combobox.mm?ds=sidebyside diff --git a/src/osx/cocoa/combobox.mm b/src/osx/cocoa/combobox.mm index 974ae190dc..88306f25d6 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(false); + } +} + 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,