X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc5c09a3aa3662137da2d781c0b101a598d2650d..f960e9e7e5a964e2336936c9d508e0d5ec7df346:/src/osx/cocoa/window.mm diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index 195d789478..80690e1c08 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -16,6 +16,7 @@ #include "wx/frame.h" #include "wx/log.h" #include "wx/textctrl.h" + #include "wx/combobox.h" #endif #ifdef __WXMAC__ @@ -70,7 +71,7 @@ NSView* GetFocusedViewInWindow( NSWindow* keyWindow ) WXWidget wxWidgetImpl::FindFocus() { - return GetFocusedViewInWindow( [[NSApplication sharedApplication] keyWindow] ); + return GetFocusedViewInWindow( [NSApp keyWindow] ); } NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin ) @@ -394,14 +395,28 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve { int eventType = [nsEvent type]; UInt32 modifiers = [nsEvent modifierFlags] ; - wxPoint screenMouseLocation = wxFromNSPoint( NULL, [nsEvent locationInWindow]); + + NSPoint locationInWindow = [nsEvent locationInWindow]; + + // adjust coordinates for the window of the target view + if ( [nsEvent window] != [m_osxView window] ) + { + if ( [nsEvent window] != nil ) + locationInWindow = [[nsEvent window] convertBaseToScreen:locationInWindow]; + + if ( [m_osxView window] != nil ) + locationInWindow = [[m_osxView window] convertScreenToBase:locationInWindow]; + } + + NSPoint locationInView = [m_osxView convertPoint:locationInWindow fromView:nil]; + wxPoint locationInViewWX = wxFromNSPoint( m_osxView, locationInView ); // these parameters are not given for all events UInt32 button = [nsEvent buttonNumber]; UInt32 clickCount = 0; - wxevent.m_x = screenMouseLocation.x; - wxevent.m_y = screenMouseLocation.y; + wxevent.m_x = locationInViewWX.x; + wxevent.m_y = locationInViewWX.y; wxevent.m_shiftDown = modifiers & NSShiftKeyMask; wxevent.m_controlDown = modifiers & NSControlKeyMask; wxevent.m_altDown = modifiers & NSAlternateKeyMask; @@ -1143,10 +1158,17 @@ void wxWidgetCocoaImpl::controlTextDidChange() wxWindow* wxpeer = (wxWindow*)GetWXPeer(); if ( wxpeer ) { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); - event.SetEventObject( wxpeer ); - event.SetString( static_cast(wxpeer)->GetValue() ); - wxpeer->HandleWindowEvent( event ); + // since native rtti doesn't have to be enabled and wx' rtti is not aware of the mixin wxTextEntry, workaround is needed + wxTextCtrl *tc = wxDynamicCast( wxpeer , wxTextCtrl ); + wxComboBox *cb = wxDynamicCast( wxpeer , wxComboBox ); + if ( tc ) + tc->SendTextUpdatedEventIfAllowed(); + else if ( cb ) + cb->SendTextUpdatedEventIfAllowed(); + else + { + wxFAIL_MSG("Unexpected class for controlTextDidChange event"); + } } } @@ -1994,13 +2016,8 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) bool wxWidgetCocoaImpl::DoHandleMouseEvent(NSEvent *event) { - NSPoint clickLocation; - clickLocation = [m_osxView convertPoint:[event locationInWindow] fromView:nil]; - wxPoint pt = wxFromNSPoint( m_osxView, clickLocation ); wxMouseEvent wxevent(wxEVT_LEFT_DOWN); SetupMouseEvent(wxevent , event) ; - wxevent.m_x = pt.x; - wxevent.m_y = pt.y; return GetWXPeer()->HandleWindowEvent(wxevent); }