]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/app.cpp
take out key handling at control level, we'll remove that later on, if things are...
[wxWidgets.git] / src / mac / app.cpp
index be6dba89abb39c24c1e4bbd3ed07427e89dec647..537bb03e73f4588ef06b3b749c8857019d5ca30d 100644 (file)
@@ -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 )