X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fbbdb7cd4c288d6d297bb93b34d360152f9b6225..ca4532668cad0441baf03cfe509d3acb84a15edd:/src/mac/app.cpp?ds=sidebyside diff --git a/src/mac/app.cpp b/src/mac/app.cpp index be6dba89ab..537bb03e73 100644 --- a/src/mac/app.cpp +++ b/src/mac/app.cpp @@ -540,6 +540,7 @@ bool wxApp::Initialize() wxMacCreateNotifierTable() ; + UMAShowArrowCursor() ; return TRUE; @@ -916,6 +917,136 @@ int wxEntry( int argc, char *argv[] , bool enterLoop ) return retValue; } +#if TARGET_CARBON + +bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec) +{ + bool converted = ConvertEventRefToEventRecord( event,rec) ; + OSStatus err = noErr ; + if ( !converted ) + { + switch( GetEventClass( event ) ) + { + case kEventClassKeyboard : + { + converted = true ; + switch( GetEventKind(event) ) + { + case kEventRawKeyDown : + rec->what = keyDown ; + break ; + case kEventRawKeyRepeat : + rec->what = autoKey ; + break ; + case kEventRawKeyUp : + rec->what = keyUp ; + break ; + case kEventRawKeyModifiersChanged : + rec->what = nullEvent ; + break ; + default : + converted = false ; + break ; + } + if ( converted ) + { + UInt32 keyCode ; + unsigned char charCode ; + UInt32 modifiers ; + GetMouse( &rec->where) ; + + err = GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, 4, NULL, &modifiers); + err = GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, 4, NULL, &keyCode); + err = GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, NULL, 1, NULL, &charCode); + rec->modifiers = modifiers ; + rec->message = (keyCode << 8 ) + charCode ; + } + } + break ; + case kEventClassTextInput : + { + switch( GetEventKind( event ) ) + { + case kEventTextInputUnicodeForKeyEvent : + { + EventRef rawEvent ; + err = GetEventParameter( event , kEventParamTextInputSendKeyboardEvent ,typeEventRef,NULL,sizeof(rawEvent),NULL,&rawEvent ) ; + converted = true ; + { + UInt32 keyCode ; + unsigned char charCode ; + UInt32 modifiers ; + GetMouse( &rec->where) ; + rec->what = keyDown ; + err = GetEventParameter(rawEvent, kEventParamKeyModifiers, typeUInt32, NULL, 4, NULL, &modifiers); + err = GetEventParameter(rawEvent, kEventParamKeyCode, typeUInt32, NULL, 4, NULL, &keyCode); + err = GetEventParameter(rawEvent, kEventParamKeyMacCharCodes, typeChar, NULL, 1, NULL, &charCode); + rec->modifiers = modifiers ; + rec->message = (keyCode << 8 ) + charCode ; + } + } + break ; + default : + break ; + } + } + break ; + } + } + + return converted ; +} + +pascal OSStatus wxMacApplicationEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) +{ + OSStatus result = eventNotHandledErr ; + + EventRecord rec ; + switch ( GetEventClass( event ) ) + { + case kEventClassKeyboard : + if ( wxMacConvertEventToRecord( event , &rec ) ) + { + wxTheApp->MacHandleOneEvent( &rec ) ; + result = noErr ; + } + break ; + case kEventClassTextInput : + if ( wxMacConvertEventToRecord( event , &rec ) ) + { + wxTheApp->MacHandleOneEvent( &rec ) ; + result = noErr ; + } + break ; + default : + break ; + } + return result ; +} + +#endif + +bool wxApp::OnInit() +{ + if ( ! wxAppBase::OnInit() ) + return FALSE ; + +#if TARGET_CARBON + static const EventTypeSpec eventList[] = + { + { kEventClassKeyboard, kEventRawKeyDown } , + { kEventClassKeyboard, kEventRawKeyRepeat } , + { kEventClassKeyboard, kEventRawKeyUp } , + { kEventClassKeyboard, kEventRawKeyModifiersChanged } , + + { kEventClassTextInput , kEventTextInputUnicodeForKeyEvent } , + } ; + + InstallApplicationEventHandler(NewEventHandlerUPP(wxMacApplicationEventHandler) + , WXSIZEOF(eventList), eventList, this, NULL); +#endif + return TRUE ; +} // Static member initialization wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL; @@ -1595,6 +1726,11 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) short keychar ; keychar = short(ev->message & charCodeMask); keycode = short(ev->message & keyCodeMask) >> 8 ; + // it is wxWindows Convention to have Ctrl Key Combinations at ASCII char value + if ( ev->modifiers & controlKey && keychar >= 0 && keychar < 0x20 ) + { + keychar += 0x40 ; + } long keyval = wxMacTranslateKey(keychar, keycode) ; bool handled = false ; wxWindow* focus = wxWindow::FindFocus() ; @@ -1612,12 +1748,13 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) event.m_timeStamp = ev->when; event.SetEventObject(focus); handled = focus->GetEventHandler()->ProcessEvent( event ) ; + if ( handled && event.GetSkipped() ) + handled = false ; if ( !handled ) { #if wxUSE_ACCEL if (!handled) { - /* wxWindow *ancestor = focus; while (ancestor) { @@ -1628,11 +1765,10 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) handled = ancestor->GetEventHandler()->ProcessEvent( command_event ); break; } - if (ancestor->m_isFrame) + if (ancestor->IsTopLevel()) break; ancestor = ancestor->GetParent(); } - */ } #endif // wxUSE_ACCEL } @@ -1649,10 +1785,18 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) event.m_timeStamp = ev->when; event.SetEventObject(focus); handled = focus->GetEventHandler()->ProcessEvent( event ) ; + if ( handled && event.GetSkipped() ) + handled = false ; } if ( !handled && (keyval == WXK_TAB) && +// CS: copied the change below from wxGTK +// VZ: testing for wxTE_PROCESS_TAB shouldn't be done here the control may +// have this style, yet choose not to process this particular TAB in which +// case TAB must still work as a navigational character +#if 0 (!focus->HasFlag(wxTE_PROCESS_TAB)) && +#endif (focus->GetParent()) && (focus->GetParent()->HasFlag( wxTAB_TRAVERSAL)) ) { @@ -1663,6 +1807,8 @@ void wxApp::MacHandleKeyDownEvent( WXEVENTREF evr ) new_event.SetWindowChange( event.ControlDown() ); new_event.SetCurrentFocus( focus ); handled = focus->GetEventHandler()->ProcessEvent( new_event ); + if ( handled && new_event.GetSkipped() ) + handled = false ; } } if ( !handled )