X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c551dc29e77df0a9842ab072eb5f1ba0ad45e66b..cd15bcaf50ead53ccf9d50965312f0dc754affb4:/src/osx/cocoa/window.mm diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index cc1fe8bf63..9bda9421f0 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -293,59 +293,70 @@ long wxOSXTranslateCocoaKey( NSEvent* event, int eventType ) case 48: retval = WXK_TAB; break; - - case 75: // / - retval = WXK_NUMPAD_DIVIDE; - break; - case 67: // * - retval = WXK_NUMPAD_MULTIPLY; - break; - case 78: // - - retval = WXK_NUMPAD_SUBTRACT; - break; - case 69: // + - retval = WXK_NUMPAD_ADD; - break; - case 76: // Enter - retval = WXK_NUMPAD_ENTER; - break; - case 65: // . - retval = WXK_NUMPAD_DECIMAL; - break; - case 82: // 0 - retval = WXK_NUMPAD0; - break; - case 83: // 1 - retval = WXK_NUMPAD1; - break; - case 84: // 2 - retval = WXK_NUMPAD2; - break; - case 85: // 3 - retval = WXK_NUMPAD3; - break; - case 86: // 4 - retval = WXK_NUMPAD4; - break; - case 87: // 5 - retval = WXK_NUMPAD5; - break; - case 88: // 6 - retval = WXK_NUMPAD6; - break; - case 89: // 7 - retval = WXK_NUMPAD7; - break; - case 91: // 8 - retval = WXK_NUMPAD8; - break; - case 92: // 9 - retval = WXK_NUMPAD9; - break; default: - //retval = [event keyCode]; break; } + + // Check for NUMPAD keys. For KEY_UP/DOWN events we need to use the + // WXK_NUMPAD constants, but for the CHAR event we want to use the + // standard ascii values + if ( eventType != wxEVT_CHAR ) + { + switch( [event keyCode] ) + { + case 75: // / + retval = WXK_NUMPAD_DIVIDE; + break; + case 67: // * + retval = WXK_NUMPAD_MULTIPLY; + break; + case 78: // - + retval = WXK_NUMPAD_SUBTRACT; + break; + case 69: // + + retval = WXK_NUMPAD_ADD; + break; + case 76: // Enter + retval = WXK_NUMPAD_ENTER; + break; + case 65: // . + retval = WXK_NUMPAD_DECIMAL; + break; + case 82: // 0 + retval = WXK_NUMPAD0; + break; + case 83: // 1 + retval = WXK_NUMPAD1; + break; + case 84: // 2 + retval = WXK_NUMPAD2; + break; + case 85: // 3 + retval = WXK_NUMPAD3; + break; + case 86: // 4 + retval = WXK_NUMPAD4; + break; + case 87: // 5 + retval = WXK_NUMPAD5; + break; + case 88: // 6 + retval = WXK_NUMPAD6; + break; + case 89: // 7 + retval = WXK_NUMPAD7; + break; + case 91: // 8 + retval = WXK_NUMPAD8; + break; + case 92: // 9 + retval = WXK_NUMPAD9; + break; + default: + //retval = [event keyCode]; + break; + } + } return retval; } @@ -462,11 +473,8 @@ bool g_lastButtonWasFakeRight = false ; - (CGFloat)scrollingDeltaY; @end -void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent ) +void wxWidgetCocoaImpl::SetupCoordinates(wxCoord &x, wxCoord &y, NSEvent* nsEvent) { - int eventType = [nsEvent type]; - UInt32 modifiers = [nsEvent modifierFlags] ; - NSPoint locationInWindow = [nsEvent locationInWindow]; // adjust coordinates for the window of the target view @@ -474,20 +482,30 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve { 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 ); + + x = locationInViewWX.x; + y = locationInViewWX.y; + +} + +void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent ) +{ + int eventType = [nsEvent type]; + UInt32 modifiers = [nsEvent modifierFlags] ; + + SetupCoordinates(wxevent.m_x, wxevent.m_y, nsEvent); // these parameters are not given for all events UInt32 button = [nsEvent buttonNumber]; UInt32 clickCount = 0; - wxevent.m_x = locationInViewWX.x; - wxevent.m_y = locationInViewWX.y; wxevent.m_shiftDown = modifiers & NSShiftKeyMask; wxevent.m_rawControlDown = modifiers & NSControlKeyMask; wxevent.m_altDown = modifiers & NSAlternateKeyMask; @@ -783,6 +801,22 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve } [super removeTrackingRect:tag]; } + +#if wxOSX_USE_NATIVE_FLIPPED +- (BOOL)isFlipped +{ + return YES; +} +#endif + +- (BOOL) canBecomeKeyView +{ + wxWidgetCocoaImpl* viewimpl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); + if ( viewimpl && viewimpl->IsUserPane() && viewimpl->GetWXPeer() ) + return viewimpl->GetWXPeer()->AcceptsFocus(); + return NO; +} + @end // wxNSView // @@ -1144,6 +1178,15 @@ typedef BOOL (*wxOSX_FocusHandlerPtr)(NSView* self, SEL _cmd); void wxWidgetCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) { + // we are getting moved events for all windows in the hierarchy, not something wx expects + // therefore we only handle it for the deepest child in the hierarchy + if ( [event type] == NSMouseMoved ) + { + NSView* hitview = [[[slf window] contentView] hitTest:[event locationInWindow]]; + if ( hitview == NULL || hitview != slf) + return; + } + if ( !DoHandleMouseEvent(event) ) { // for plain NSView mouse events would propagate to parents otherwise @@ -1168,20 +1211,45 @@ void wxWidgetCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) void wxWidgetCocoaImpl::cursorUpdate(WX_NSEvent event, WXWidget slf, void *_cmd) { - NSCursor *cursor = (NSCursor*)GetWXPeer()->GetCursor().GetHCURSOR(); - if (cursor == NULL) + if ( !SetupCursor(event) ) { wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; - superimpl(slf, (SEL)_cmd, event); + superimpl(slf, (SEL)_cmd, event); } - else + } + +bool wxWidgetCocoaImpl::SetupCursor(WX_NSEvent event) +{ + extern wxCursor gGlobalCursor; + + if ( gGlobalCursor.IsOk() ) + { + gGlobalCursor.MacInstall(); + return true; + } + else { - [cursor set]; + wxWindow* cursorTarget = GetWXPeer(); + wxCoord x,y; + SetupCoordinates(x, y, event); + wxPoint cursorPoint( x , y ) ; + + while ( cursorTarget && !cursorTarget->MacSetupCursor( cursorPoint ) ) + { + // at least in GTK cursor events are not propagated either ... +#if 1 + cursorTarget = NULL; +#else + cursorTarget = cursorTarget->GetParent() ; + if ( cursorTarget ) + cursorPoint += cursorTarget->GetPosition(); +#endif + } + + return cursorTarget != NULL; } } - - void wxWidgetCocoaImpl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd) { if ( [event type] == NSKeyDown ) @@ -1227,14 +1295,14 @@ bool wxWidgetCocoaImpl::performKeyEquivalent(WX_NSEvent event, WXWidget slf, voi { wxEvtHandler * const handler = m_wxPeer->GetEventHandler(); - wxCommandEvent command_event( wxEVT_COMMAND_MENU_SELECTED, command ); + wxCommandEvent command_event( wxEVT_MENU, command ); command_event.SetEventObject( wxevent.GetEventObject() ); handled = handler->ProcessEvent( command_event ); if ( !handled ) { // accelerators can also be used with buttons, try them too - command_event.SetEventType(wxEVT_COMMAND_BUTTON_CLICKED); + command_event.SetEventType(wxEVT_BUTTON); handled = handler->ProcessEvent( command_event ); } } @@ -1284,6 +1352,9 @@ bool wxWidgetCocoaImpl::resignFirstResponder(WXWidget slf, void *_cmd) NSView* otherView = FindFocus(); wxWidgetImpl* otherWindow = FindFromWXWidget(otherView); + // CS: the fix for #12267 leads to missed focus events like in #14938 , as #12267 doesn't seem to happen anymore even + // without the fix, I'm turning it off, if it still is needed we should only use it in case of the wxGridCellTextEditor +#if 0 // It doesn't make sense to notify about the loss of focus if we're not // really losing it and the window which has just gained focus is the same // one as this window itself. Of course, this should never happen in the @@ -1291,7 +1362,8 @@ bool wxWidgetCocoaImpl::resignFirstResponder(WXWidget slf, void *_cmd) // enter into an infinite recursion, see #12267. if ( otherWindow == this ) return r; - +#endif + // NSTextViews have an editor as true responder, therefore the might get the // resign notification if their editor takes over, don't trigger any event then if ( r && !m_hasEditor) @@ -2454,7 +2526,7 @@ void wxWidgetCocoaImpl::InstallEventHandler( WXWidget control ) } NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited|NSTrackingCursorUpdate|NSTrackingMouseMoved|NSTrackingActiveAlways|NSTrackingInVisibleRect; - NSTrackingArea* area = [[NSTrackingArea alloc] initWithRect: NSZeroRect options: options owner: m_osxView userInfo: nil]; + NSTrackingArea* area = [[NSTrackingArea alloc] initWithRect: NSZeroRect options: options owner: m_osxView userInfo: nil]; [m_osxView addTrackingArea: area]; [area release]; } @@ -2531,7 +2603,11 @@ bool wxWidgetCocoaImpl::DoHandleMouseEvent(NSEvent *event) { wxMouseEvent wxevent(wxEVT_LEFT_DOWN); SetupMouseEvent(wxevent , event) ; - return GetWXPeer()->HandleWindowEvent(wxevent); + bool result = GetWXPeer()->HandleWindowEvent(wxevent); + + (void)SetupCursor(event); + + return result; } void wxWidgetCocoaImpl::DoNotifyFocusEvent(bool receivedFocus, wxWidgetImpl* otherWindow) @@ -2648,11 +2724,13 @@ wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) { NSView* cv = [tlw contentView]; c = new wxWidgetCocoaImpl( now, cv, true ); - // increase ref count, because the impl destructor will decrement it again - CFRetain(cv); - if ( !now->IsShown() ) - [cv setHidden:NO]; - + if ( cv != nil ) + { + // increase ref count, because the impl destructor will decrement it again + CFRetain(cv); + if ( !now->IsShown() ) + [cv setHidden:NO]; + } } else {